2012-07-10 295 views
23

我是內核開發的新手,我想知道如何使用QEMU和gdb運行/調試Linux內核。我實際上閱讀了羅伯特·洛夫的書,但不幸的是,它並沒有幫助讀者如何安裝適當的工具來運行或調試內核......所以我所做的就是遵循本教程http://opensourceforu.efytimes.com/2011/02/kernel-development-debugging-using-eclipse/。我使用eclipse作爲IDE在內核上開發,但我首先想讓它在QEMU/gdb下運行。因此,我所做到目前爲止是:如何使用GDB和QEMU調試Linux內核?

1)與編譯內核:

make defconfig (then setting the CONFIG_DEBUG_INFO=y in the .config) 
make -j4 

2)一旦編譯了我用跑的Qemu:

qemu-system-x86_64 -s -S /dev/zero -kernel /arch/x86/boot/bzImage 

其進入內核在「停止」狀態

3)因此,我不得不使用gdb的,我嘗試使用以下命令:

gdb ./vmlinux 

它運行正確,但...現在我不知道該怎麼辦......我知道我必須使用端口1234(Qemu使用的默認端口)上的遠程調試,使用vmlinux作爲符號表文件進行調試。

所以我的問題是:我應該怎麼做才能在Qemu上運行內核,將調試器附加到它上面,從而使它們一起工作,使內核開發更輕鬆。

回答

19

我想嘗試:

(gdb) target remote localhost:1234 
(gdb) continue 

使用「-s」選項使QEMU監聽TCP端口1234 ::,您可以連接到爲localhost:1234,如果你是在同一臺機器上。 Qemu的'-S'選項會讓Qemu停止執行,直到您執行continue命令。

最好的事情可能是看看一個體面的GDB教程,以配合你正在做的事情。 This one看起來相當不錯。

+0

謝謝它的作品很多:)。我剛剛讀完了這本書,內容涉及DDD,eclipse和gdb,不是由澱粉出版社出版的,但本書沒有遠程調試。我的內核現在正在啓動,但似乎需要一些時間來加載(因爲Qemu似乎只使用我的機器上的一個線程),現在被阻止在:? kernel_thread_helper +爲0x0/0x10的。它是內核用來加載的方式嗎?我的意思是,一旦它被加載,我們不應該有一個命令提示符嗎?謝謝 – 2012-07-10 09:24:45

+0

它適合我。但是,我不知道如何在調用第一次繼續之後強制停止斷點。例如,我在start_kernel函數中放置了一個斷點,但它永遠不會停在那裏。任何想法 ? – ARH 2013-03-17 04:35:03

2

當您嘗試用gdb啓動vmlinux的exe文件,在GDB那麼第一件事就是發出CMDS:

(GDB)目標遠程本地主機:1234

(GDB)破的start_kernel

(繼續)

這將在start_kernel中破壞內核。

+0

我使用eclipse調試在qemu中運行的內核,並在start_kernel中設置了stop。但是它在eclipse啓動調試後運行。我已經設置qemu在啓動時停止,並且單獨使用gdb是可以的。 – Ezio 2015-06-24 05:41:42

3

BjoernID的回答對我來說並不適用。第1持續後,沒有達成任何斷點和中斷,便見線,如:

0x0000000000000000 in ??() 
(gdb) break rapl_pmu_init 
Breakpoint 1 at 0xffffffff816631e7 
(gdb) c 
Continuing. 
^CRemote 'g' packet reply is too long: 08793000000000002988d582000000002019[..] 

我想這已經是與不同的CPU模式(實模式在BIOS中對長模式時,Linux有引導)。總之,解決的辦法是,而無需等待(不-S即)首先運行QEMU:

qemu-system-x86_64 -enable-kvm -kernel arch/x86/boot/bzImage -cpu SandyBridge -s 

就我而言,我需要在引導過程中的東西打破,所以一些十分之一秒後,我跑了GDB命令。如果你有更多的時間(例如,你需要調試一個手動加載的模塊),那麼時間並不重要。

gdb允許您指定啓動時應運行的命令。這使自動化更容易一些。要連接到QEMU(應該現已開始),打破功能並繼續執行,使用方法:

gdb -ex 'target remote localhost:1234' -ex 'break rapl_pmu_init' -ex c ./vmlinux 
13

步驟一步程序的Ubuntu 16.10主機

若要從頭開始很快我在做了一個最小的全自動QEMU + Buildroot裏面例如在測試:https://github.com/cirosantilli/linux-kernel-module-cheat/blob/c7bbc6029af7f4fab0a23a380d1607df0b2a3701/gdb-step-debugging.md主要步驟如下所述。

首先得到一個根文件系統rootfs.cpio.gz。如果你需要一個考慮:

然後在Linux內核:

git checkout v4.15 
make mrproper 
make x86_64_defconfig 
cat <<EOF >.config-fragment 
CONFIG_DEBUG_INFO=y 
CONFIG_DEBUG_KERNEL=y 
CONFIG_GDB_SCRIPTS=y 
EOF 
./scripts/kconfig/merge_config.sh .config .config-fragment 
make -j"$(nproc)" 
qemu-system-x86_64 -kernel arch/x86/boot/bzImage \ 
        -initrd rootfs.cpio.gz -S -s \ 
        -append nokaslr 

在另一個終端上,從Linux內核樹內部,假設您要從start_kernel開始調試:

gdb \ 
    -ex "add-auto-load-safe-path $(pwd)" \ 
    -ex "file vmlinux" \ 
    -ex 'set arch i386:x86-64:intel' \ 
    -ex 'target remote localhost:1234' \ 
    -ex 'break start_kernel' \ 
    -ex 'continue' \ 
    -ex 'disconnect' \ 
    -ex 'set arch i386:x86-64' \ 
    -ex 'target remote localhost:1234' 

我們完成了!

內核模塊的看到:How to debug Linux kernel modules with QEMU?

的Ubuntu 14.04,GDB 7.7.1,需要hbreakbreak軟件斷點被忽略了。在16.10中不再是這種情況。另請參見:https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944

凌亂disconnect什麼來後它是解決該錯誤:

Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000 

相關主題:

已知的限制:

參見: