簡體   English   中英

查找 function 末尾的行號

[英]finding line number of end of a function

我試圖通過 GDB 打印 function 的輸入和輸出來自動化一些調試,當 function 命中時。 為了能夠在這些地方設置斷點,我正在執行以下操作。 我正在使用模板和 rbreak:。 沒有在我的文件中的函數處打斷點。 所以我從可執行文件中提取函數的行號如下。

  1. 使用可執行文件,提取 function 的開始行號;

納米a.out | grep "類名" | grep "函數名" | grep "t" | addr2line -e a.out -f | grep "cpp" | 獨特的

-> this outputs the filename:linenumber
  1. 將這些內容添加到帶有“b 前綴”的 a.gdb 文件中

查詢 - 我們如何從可執行文件中提取 function 結尾的行號?

有了這些信息,我可以將它添加到 GDB 腳本中,最終腳本如下所示。 該腳本將在程序執行之前加載到 GDB 中。

b filepath:<startline of function>
commands
print input1 input2 etc
continue 
end

b filepath:<endline of function>
commands
print output1 output2 etc
continue 
end

給定 function 的可執行文件和起始行,仍然只找到屬於類/文件的給定 function 的結束行

我也考慮過使用 GDB完成命令,但控制權已經返回給調用者。 在被調用的 function 中而不是調用者中很容易打印,這樣我們就可以監控 function 的每個調用的輸入/輸出。 這將在很大程度上簡化我的調試。

任何建議/意見都非常感謝。 非常感謝提前!

首先,請注意模板函數不是函數,而是實際的配方。 當您使用模板時,編譯器會從模板生成 function。

如果要使用break命令,則需要完整的 function 名稱。 例如,下面的模板

template <typename T>
inline T doubleInput(const T& x) {
    return 2 * x;
}

當您傳遞一個 int 時,將變為 function doubleInput<int> ,當您傳遞一個雙精度時,將變為doubleInput<double>等。您需要包括<type>部分在內的整個名稱來使用break命令添加斷點,即使在這種情況下它只會在模板的特定情況下停止。

但是rbreak命令確實適用於模板。 如果您在 gdb rbreak doubleInput*中編寫,則將在模板的所有現有特化中添加斷點。

請參閱此問題中的答案


我不知道 gdb 現在是否具有在 function 的返回中添加斷點的功能,但是九歲問題中的答案提供了一些可能性,包括自定義 Z23EEEB4347BDD26BFC6B7EE9A3B755 指令或添加斷點到retq指令使用反向調試。 我沒有嘗試過這些選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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