[英]automatic debugging with gdb
我正在處理一個包含大量全局變量的大型代碼庫。 在某些特殊的數據集下,它會產生錯誤的結果。 我想用 gdb 自動運行幾個場景,自動逐步執行和定期轉儲一些值並在一些文件中記錄跟蹤。 手動操作會毀了我的視力和大腦。 我推測有一些全局混亂。 如何自動執行此操作? 使用一些腳本。 所有這些都在 RH linux 中。 提前致謝。
嘗試使用條件中斷手動執行此操作,但一段時間后放棄了
我想用 gdb 自動運行幾個場景,自動逐步執行和定期轉儲一些值並在一些文件中記錄跟蹤。
在反向調試器(例如rr )下運行程序可能會更有效,並將錯誤的結果追溯到其源。
如何自動執行此操作?
你不能自動地做你不能用算法表達的事情,你還沒有描述你想要使用的算法。 如果它類似於“每調用 100 次foo
就停止並打印這 500 個全局變量的值”,那么使用 GDB 可以輕松實現自動化。
使用嵌入式 Python 可以實現更復雜的算法。
在主文件夾中的.gdbinit
文件中添加
add-auto-load-safe-path /path_to_the_folder_containing_your_executable/
現在,您可以在您的可執行文件所在的同一文件夾中創建另一個.gdbinit
文件,當您從那里啟動 gdb 時將加載該文件(您家中的.gdbinit
文件也已讀取 - 如果您有不錯的東西,例如加載漂亮的打印機)。
在這個.gdbinit
文件中,添加以下代碼
file your_executable_name
start
# Optional
set args "<any command line parameters you program might need>"
# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Add gdb commands below to set breakpoints, print variable values, etc
# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
run
Gdb 非常強大,我將列出一些可能有助於實現自動化的東西。
b filename.ext:line_number
或b function_name
設置斷點commands breakpoint_number
(請參見此處),然后列出在命中此斷點后應運行的命令。 使用end
完成命令
start
將計為斷點,因此您添加的第一個斷點將是斷點 2)一種想法是,您可以使用便利變量保存重要的全局變量的地址(如果它們不總是可訪問的)。 例如,在此全局變量所在的位置添加一個斷點,然后在此斷點中添加命令以將此變量的地址保存到一個便利變量,然后再continue
(使用continue
您將不會看到 gdb 停在那里)。
set $var1 = &myglobal
continue
您可能還想在continue
避免再次在此斷點處停止之前使用delete breakpoint_number
刪除此斷點。
然后只要 object 存在,當程序在myglobal
可能無法直接訪問的不同斷點處停止時,您可以使用p $var1
或p $var1->something
檢查它。
在遇到斷點時添加的命令中,您可以執行諸如echo message explaining where you are
、 p some_var
以查看變量值甚至python some_complicated_python_code
的操作。
如果您想使用 python 獲得更多功率,則值得閱讀手冊中有關它的部分。 讓我舉一個例子。 假設您的一個全局變量存儲在一個名為“$myvar”的便利變量中。 然后你可以將它傳遞給 python 解釋器
python myvar = gdb.parse_and_eval("$myvar")
您還可以將當前 scope 中的任何變量傳遞給parse_and_eval
。 現在,假設這個全局變量存儲一個 class 的 object,您要檢查一個“n_elem”屬性。 你可以打印它
python print(myvar["n_elem"])
您還可以在同一文件夾中創建 python 文件並使用
python from my_python_file import *
導入那里定義的函數。
借助這些 gdb 功能,您幾乎可以自動化您可能需要的任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.