![](/img/trans.png)
[英]how to set a breakpoint and execute other gdb commands while debugging python C extension
[英]How to set or modify breakpoint commands in a gdb python script
在gdb python腳本中,如何設置或修改斷點的命令列表?
我可以手動完成。 例如,要更改斷點2的命令列表,在提示符下,我可以輸入:
(gdb) commands 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>info reg rax
>set $rax=0x1234
>end
但是,從gdb python腳本來看,我似乎無法執行多行命令。
gdb.execute("commands 2\ninfo reg rax\nset $rax=0x1234\nend\n")
只是讓我輸出像
(gdb) source blah.py
>
它坐在那里以獲得更多輸入。 在我鍵入end
並按Enter之前,它不會繼續。 然后,它只是發出抱怨,表明它在該字符串的commands 2
之后沒有正確解析任何內容。
嘗試分別輸入每行無濟於事。 例如腳本:
gdb.execute("commands 2")
gdb.execute("info reg rax")
gdb.execute("set $rax=0x1234")
gdb.execute("end")
在第一次執行期間等待用戶的更多輸入,因此也有類似的問題。 盡管大部分都是希望,但以下操作也不起作用:
gdb.execute(["commands 2","info reg rax","set $rax=0x1234","end"])
使用gdb.breakpoints()
可以很容易地以編程方式獲取斷點列表。 這些對象都有一個屬性commands
,可以看到我手動設置或從本地gdb腳本設置的任何命令。 但是,如果我嘗試修改此屬性,它將失敗。 因此,一旦手動設置了某些東西或gdb腳本,Python腳本似乎就無法對其進行編輯。 該API文檔缺少很多有用的信息,但是它確實聲明了https://sourceware.org/gdb/onlinedocs/gdb/Breakpoints-In-Python.html#Breakpoints-In-Python Variable: Breakpoint.commands ... This attribute is not writable.
而且不,對於“從不使用gdb腳本”或“從不手動輸入命令”以及“相反,始終編寫python gdb.Breakpoint子類並將Breakpoint.stop()設置為執行特殊操作,我認為這不是一個有用的答案,並重寫所有現有腳本以使用此類功能”。 我似乎只能找到該解決方法的信息。 但是由於gdb的怪癖,我不願意放棄當前的交互方法。
由於我可以輕松地運行命令來手動完成我想做的事情,因此必須有一種方法可以通過gdb python腳本修改或設置斷點命令。 我該怎么做呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.