2010-01-24 77 views
4

我我第一次內核模塊上工作,所以我在這個有點新...調試Linux內核在VMWare與Windows主機

我的模塊有時會產生恐慌,我不能去了它的底部使用printk。至於我可以告訴我的選擇調試是:

1)找到生成的Oops消息和使用ksymoops的

2)在遠程調試使用的kgdb

我試着正在開發一個Windows主機,並在VMWare上運行Ubuntu,以便讓事情變得複雜一些。我想先嚐試OOPS消息,但我不知道如何捕獲它。當它發生時,我是否需要運行串行控制檯?如果是這樣,我怎麼能用Windows主機來做到這一點?我需要兩臺VM嗎?

就像我說的,我對這個(和Linux一般)有點新,所以我可以真正使用一些指導。謝謝!

回答

3

前一段時間我成功地使用了「alinrus」這個技術。他提到的部分詳細解釋如下: http://stackframe.blogspot.com/2007/04/debugging-linux-kernels-with.html

我實際上直接從Windows主機使用它。因此,在設置VM後(主要是啓用遠程調試和下載內核(在vmlinux的文件,不能用GDB)解釋將vmlinuz文件),你需要做到以下幾點:

  1. 安裝最近在你的Windows機器上使用了gdb(我使用了Cygwin中的gdb)。
  2. 使用vmlinux文件啓動gdb,然後執行「target remote localhost:8832」連接虛擬機(運行時)。

這就是你需要調試靜態鏈接到內核的代碼。你可以嘗試靜態鏈接你的模塊,上面的就足夠了。爲動態鏈接模塊設置調試需要一個額外的步驟來通知gdb使用你的模塊文件,以及如何解釋文件的部分。

3a。加載模塊後(並在崩潰之前)在.ko文件中運行下面的腳本。

3b。將產生的「add-symbol-file mymodule.ko 0xe8884000 ...」行粘貼到gdb中。然後gdb會加載你的模塊,只要它可以在你指定的當前目錄或路徑中找到它。

腳本是從http://anomit.com/2009/11/04/kernel-module-debugging-a-simple-technique/

 
#!/bin/sh 
# 
# gdbline module image 
# 
# Outputs an add-symbol-file line suitable for pasting into gdb to examine 
# a loaded module. 
# 
cd /sys/module/$1/sections 
PROG=${1}.ko 
echo -n add-symbol-file ${PROG} `/bin/cat .text` 
#echo -n add-symbol-file $2 `/bin/cat .text` #Take second argument to be gdb name of program/object file 

for section in .[a-z]* *; do 
    if [ $section != ".text" ]; then 
     echo " \\" 
     echo -n "  -s" $section `/bin/cat $section` 
    fi 
done 
echo 

有可能需要做更多的事情。要進行實際的源代碼級調試,您需要取消所有內核和模塊源代碼,以便gdb可以找到它。有一些技巧可以用來在沒有優化的情況下編譯模塊,一旦你得到了這些。

您可能還想看看Workstation 7.0關於重放調試的技術說明,其中包含關於調試內核模塊的信息。 VMware知道他們的東西。 http://www.vmware.com/pdf/ws7_replay_linux_technote.pdf

1

我不知道這是否會幫助你Winblowz,但如果你可以將你的虛擬機到Linux框:

Debugging Linux kernels with Workstation 6.0

我們只是靜靜地添加一個令人興奮的 功能到Workstation 6.0。我相信 它將使WS6成爲Linux內核開發的絕佳工具。您現在可以在您的主機上使用gdb來調試運行在虛擬機內的Linux內核,即 。沒有 kdb,不需要重新編譯,也不需要 第二臺機器。所有你需要的是一個 單行虛擬機的配置 文件。

我認爲這也可能適用於其他最近的VMware產品。

因爲它在Mac OSX以及我懷疑它會在Winblowz工作也:

Debugging linux kernel (inside vmware) from Mac OSX

由於這個線程建議,你也可能在遠離虛擬機上運行的第二個Linux調試一臺Linux VM同一臺機器。