2010-03-10 32 views
68

我在gdb的目標可執行文件之外,我甚至沒有對應於該目標的堆棧。無論如何,我想要單步執行,以便我可以驗證彙編代碼中發生了什麼,因爲我不是x86彙編的專家。不幸的是,gdb拒絕執行這個簡單的彙編級調試。它允許我在適當的斷點處設置和停止,但只要我嘗試單步啓動,gdb會報告錯誤「無法找到當前函數的邊界」,並且EIP不會更改。使用gdb在指定的可執行文件之外的單步彙編代碼會導致錯誤「找不到當前函數的邊界」

的附加細節:通過GCC asm語句生成

機器代碼和我它複製到其中它執行內核存儲器位置,從objdump的-d的輸出。我不介意使用加載器將對象代碼加載到重定位地址的簡單方法,但請記住加載必須在內核模塊中完成。

我想另一種選擇是產生一個假的內核模塊或調試信息文件給gdb,使它相信這個區域在程序代碼中。 gdb可以在內核可執行文件本身上正常工作。 (對於那些真正想知道的人,我在運行時將代碼插入到VMware VM內部的Linux內核數據空間中,並通過gdb從gdb調試遠程內核,通過VMware Workstation的內置gdb存根調試內核。注意:我不是在編寫內核漏洞;我是一名安全研究生寫的原型)

(我可以在我的程序集中的每條指令上設置一個斷點,這個工作但會很費力一段時間後,因爲x86彙編指令會有所不同,並且每次重新啓動時程序集的位置都會更改。)

+0

聰明的http://www.ksplice.com/通過組裝「假」內核模塊並加載它們,將數據和代碼注入內核。如果他們能做到,爲什麼不能呢? ;-) – ephemient 2010-03-10 23:20:43

回答

90

您可以使用stepinexti(可縮寫爲t sini)來遍歷您的機器代碼。

+1

哇。回想起來,我並不怎麼忘記stepi。我想我只是假設,因爲gdb沒有源代碼,該步驟將恢復爲彙編指令。 – Paul 2010-03-11 03:31:12

+0

注意:您經常無法爲裝配程序輸入「break main」,「run」。改爲輸入「layout asm」,「start」。我通過閱讀下面的消息得到了這一點,但閱讀這篇文章的其他人可能沒有那麼耐心。 – Dmitry 2016-04-14 18:47:12

22

您可以在這裏做的最有用的事情是display/i $pc,在使用stepi之前已經在R Samuel Klatchko的回答中提出過。這告訴gdb在每次打印提示之前都要反彙編當前指令;那麼您可以繼續按Enter鍵以重複stepi命令。

(見my answer to another question更多細節 - 這個問題的背景是不同的,但原理是一樣的。)

126

相反的gdb,運行gdbtui。或者使用-tui開關運行gdb。或在輸入gdb後按C-x C-a。現在您處於GDB的TUI模式。

輸入layout asm使上部窗口顯示組件 - 這將自動跟隨您的指令指針,但您也可以在調試時更改框架或滾動。按C-x s即可進入單鍵模式,其中run continue up down finish等縮寫爲單個鍵,可讓您快速瀏覽程序。

 
    +---------------------------------------------------------------------------+ 
B+>|0x402670 <main>   push %r15          | 
    |0x402672 <main+2>  mov %edi,%r15d         | 
    |0x402675 <main+5>  push %r14          | 
    |0x402677 <main+7>  push %r13          | 
    |0x402679 <main+9>  mov %rsi,%r13         | 
    |0x40267c <main+12>  push %r12          | 
    |0x40267e <main+14>  push %rbp          | 
    |0x40267f <main+15>  push %rbx          | 
    |0x402680 <main+16>  sub $0x438,%rsp         | 
    |0x402687 <main+23>  mov (%rsi),%rdi         | 
    |0x40268a <main+26>  movq $0x402a10,0x400(%rsp)      | 
    |0x402696 <main+38>  movq $0x0,0x408(%rsp)       | 
    |0x4026a2 <main+50>  movq $0x402510,0x410(%rsp)      | 
    +---------------------------------------------------------------------------+ 
child process 21518 In: main       Line: ?? PC: 0x402670 
(gdb) file /opt/j64-602/bin/jconsole 
Reading symbols from /opt/j64-602/bin/jconsole...done. 
(no debugging symbols found)...done. 
(gdb) layout asm 
(gdb) start 
(gdb) 
+0

太棒了。我之前使用過emacs UI,但我不知道gdb有一個內置的TUI。 – Paul 2010-03-11 03:32:53

+0

這太棒了! – xis 2016-03-03 04:03:34

相關問題