2014-04-03 34 views
0

我正在嘗試編寫一個GDB腳本來執行有界的指令跟蹤(即啓動addr和停止addr)。也許我在谷歌失敗,但我似乎不能發現這已經存在。用於有界指令跟蹤的GDB python腳本

這裏是我的刺吧:

python 

def start_logging(): 
    gdb.execute("set logging on") 
    gdb.execute("while $eip != 0xBA10012E9") 
    gdb.execute("x/1i $eip") 
    gdb.execute("stepi") 
    gdb.execute(" end") 
    gdb.execute("set logging off") 

gdb.execute("set pagination off") 
gdb.execute("break *0xBA19912CF") 
gdb.execute("command 1 $(start_logging())") 
gdb.execute("continue") 

在我看來這應該設置一個斷點,然後設置,當它擊中運行該命令。當斷點擊中它時,應該單步執行代碼直到結束地址被觸發,然後關閉日誌記錄。

當我用gdb運行這個應用程序將在正確的點斷開,但沒有命令運行。

我在做什麼錯?對不起,如果這是錯誤的方式去做這個請讓我知道。我是gdb腳本新手

回答

1

我在這裏看到一些奇怪的東西。

首先,它看起來像你試圖通過多次調用gdb.execute來分割多行gdb命令。我不相信這會起作用。當然,它並不打算工作。

其次,沒有理由通過gdb.execute嘗試執行「while」循環。最好直接在Python中完成。

第三,我認爲「命令」行似乎也很不對。我真的不明白它正在嘗試做什麼,我猜在打斷點時會打電話給start_logging?然後繼續?那麼,它不會像書面那樣工作。

我的建議是這樣的:

gdb.execute('break ...') 
gdb.execute('run') 
while gdb.parse_and_eval('$eip') != 0x...: 
    gdb.execute('stepi') 

如果你真的想記錄,無論是做「設置日誌記錄」的業務或只是指示gdb.execute返回一個字符串,並用Python記錄它。

+0

感謝您的迴應,我認爲gdb.execute需要執行一個命令,當我只是讓他們在文件中失敗?我嘗試把gdb.exe中的多行gdb命令放在一個字符串中,它似乎並不喜歡這樣,要麼是它們是多命令的原因。 至於你提出的例子,我會嘗試一下,而不是使用break命令(這是我的意圖是用我的代碼) –

+0

更新我的腳本與您的更新,現在我有問題,斷點得到設置和gdb方面,它似乎認爲它告訴應用程序運行,因爲它只是等待。但應用程序仍然認爲它停止。如果我按Ctrl + C gdb然後手動鍵入繼續它的作品。但爲什麼我的腳本繼續工作? –