2014-10-09 51 views
7

到目前爲止,通過gdb + qemu,我可以跨入Linux內核源代碼。是否可以同時調試用戶空間程序?例如,單步執行從用戶空間到內核空間的程序,以便我可以通過發行info registers來觀察qemu顯示器上的寄存器更改?是否可以使用gdb和qemu同時調試linux用戶空間程序和內核空間?

+0

爲什麼不呢?要查看任務切換,請嘗試單步調試['__schedule'](http://lxr.free-electrons.com/source/kernel/sched/core.c?v=3.17#L2753),特別是正確,因爲它「返回「來完成新的任務。否則,請嘗試在各種系統調用中設置斷點,以查看進程調用它們時會發生什麼。 – 2014-10-09 06:44:11

+0

感謝Jonathon,但是當程序仍然在用戶空間中運行時,我可以中斷嗎?實際上,我更感興趣的是在用戶空間中運行進程時觀察寄存器。 – 2014-10-09 09:47:53

+0

@JeffLi您是否設法在qemu中調試用戶空間程序?我試圖做同樣的事情,但不知道如何確定程序加載地址如何 – 2015-08-09 14:39:00

回答

3

我通過使用gdb命令add-symbol-file來添加用戶空間程序調試信息來實現它。但是你必須知道這些程序加載地址。準確地說,您必須像平常一樣通過將gdb連接到gdbserver來啓動內核調試;然後,您可以添加這些程序調試信息。你也可以使用.gdbinit腳本。閱讀this

+0

? – 2015-08-09 14:40:11

+0

objdump -h <程序鏈接文件> – Mahouk 2015-08-11 09:43:42

+0

您可以查找.text部分的VMA(鏈接地址)和LMA(加載地址)。這些地址爲您提供您正在查找的信息 – Mahouk 2015-08-11 09:53:16

0

最小的一步setep設置

,但這裏是一個fully automated QEMU + Buildroot example這presuposes你already know how to debug the kernel with QEMU + gdb和更詳細的exaplanation:

readelf -h myexecutable | grep Entry 

給出:

Entry point address:    0x4003a0 

所以在GDB裏面我們需要做的是:

add-symbol-file myexecutable 0x4003a0 
b main 

,然後纔開始在QEMU的可執行文件:

myexecutable 

更可靠的方式做到這一點是設置myexecutable作爲init過程中,如果你能做到這一點。

爲什麼你會想要這樣做而不是gdbserver

,我只能看到一個用例爲這個至今:調試initDebug init on Qemu using gdb

否則,爲什麼不直接使用下面的更可靠的方法,例如步入一個系統調用:

我提出這一點,因爲:

  • 使用QEMU GDB的用戶態可導致隨機跳躍爲內核上下文切換到另一個進程使用相同的虛擬地址
  • 我無法正確加載共享庫沒有gdbserver:試圖sharedlibrary直接給出:

    (gdb) sharedlibrary ../../staging/lib/libc.so.0 
    No loaded shared libraries match the pattern `../../staging/lib/libc.so.0'. 
    

    結果,因爲大多數內核相互作用經過stdib,你需要做大量的智能裝配的步進找到內核的入口,這可能是不切實際的。

    直到,也就是說,有人寫了一個更智能的GDB腳本,該腳本對每條指令執行步驟,直到發生上下文切換或者直到源變爲可用。我想知道這樣的腳本不會太慢,因爲天真的方法在每條指令上都有來自GDB的通信開銷。

    這可能讓你開始:Tell gdb to skip standard files

相關問題