問題: 我希望能夠在我的 C 代碼中放置不同的潛在唯一或重復的“標簽”,以便我可以在 gdb 中使用它們來創建斷點。
類似作品:
斷點到行號:與源代碼行上的斷點的主要區別在于,如果標記之前的代碼被修改為導致更多或更少的行,對標記的參考在語意上仍然是正確的,對源代碼行的參考不會。
標簽:我來自我之前的問題,如何告訴 gcc 保留我未使用的標簽?,其中我先入為主的想法是答案是插入標簽。在與平臺的知識淵博的成員討論后,我被告知編譯后不會保留標簽的名稱。未在 C 中使用的標簽由編譯器洗掉。
注入 asm 標簽:與前面的方法相關,如果我在 C 源代碼中注入 asm 代碼,由于行內函式、編譯器優化和缺乏作用域,會出現某些問題。這使得這種方法不穩健。
定義一個虛擬函式:關于另一個問題,在C檔案中設定GDB斷點,有一個有趣的方法,可以在代碼中放置一個“虛擬”函式,然后在函式呼叫中添加一個斷點。這種方法的問題在于必須為每個不同的標簽復制這種函式的定義。
有沒有更好的解決方案來實作這一目標?或者從不同的角度來解決所提出的問題?
uj5u.com熱心網友回復:
您可以創建一個虛擬變數并將其設定為不同的值。然后你可以使用條件觀察點。例子:
#include <stdio.h>
static volatile int loc;
int main()
{
loc = 1;
puts("hello world");
loc = 2;
return 0;
}
(gdb) watch loc if loc == 2
Hardware watchpoint 1: loc
(gdb) r
Starting program: /tmp/a.out
hello world
Hardware watchpoint 1: loc
Old value = 1
New value = 2
main () at test.c:8
8 return 0;
您當然可以將分配包裝在一個宏中,這樣您只能在除錯版本中獲得它。通常的警告適用:優化和行內可能會受到影響。
uj5u.com熱心網友回復:
您可以#warning在需要斷點的每一行插入一個,然后撰寫一個腳本來決議編譯器訊息中的檔案和行號,并撰寫一個.gdbinit在這些位置放置斷點的檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/364673.html
上一篇:指標賦值中的(int*)array、(int*)&array和&array之間有什么區別?
下一篇:重新分配期間的跟蹤/斷點陷阱
