簡體   English   中英

用gdb自動調試

[英]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_numberb function_name設置斷點
  • 您可以使用commands breakpoint_number (請參見此處),然后列出在命中此斷點后應運行的命令。 使用end完成命令
    • 您知道斷點編號,因為它們是按順序創建的(請注意, start將計為斷點,因此您添加的第一個斷點將是斷點 2)
  • 您可以使用便利變量來存儲有用的東西,例如重要的 object 的地址
  • python api非常強大

一種想法是,您可以使用便利變量保存重要的全局變量的地址(如果它們不總是可訪問的)。 例如,在此全局變量所在的位置添加一個斷點,然后在此斷點中添加命令以將此變量的地址保存到一個便利變量,然后再continue (使用continue您將不會看到 gdb 停在那里)。

set $var1 = &myglobal
continue

您可能還想在continue避免再次在此斷點處停止之前使用delete breakpoint_number刪除此斷點。

然后只要 object 存在,當程序在myglobal可能無法直接訪問的不同斷點處停止時,您可以使用p $var1p $var1->something檢查它。

在遇到斷點時添加的命令中,您可以執行諸如echo message explaining where you arep 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM