2011-06-01 41 views
4

是否有可能讓gdb將某些東西記錄到終端而不是破壞它?例如,我想在某些方法上設置一個「斷點」,並在每次調用該方法時使gdb自我打印以及參數。基本上我想在沒有實際重新編譯的情況下將打印語句插入任意位置。gdb:記錄的東西,而不是打破?

感謝您的任何建議


這是我後至今,這些有益的意見有:

define logFoo 
b fooMethod 
commands 
po self 
end 
end 

GDB似乎並不喜歡嵌套結束語句雖然。有什麼想法嗎?

+0

爲了將來的參考,雙重目的是一個已知的錯誤。解決方法是將內部塊放在單獨的文本文件中並使用源來加載它。 – 2011-06-01 23:49:39

回答

9

您可以使用Breakpoint Command Lists。有一個例子是如何做到的。

例如,這裏是你如何可以使用 斷點命令在進入打印x的值 爲foo每當x是 陽性。

break foo if x>0 
commands 
silent 
printf "x is %d\n",x 
cont 
end 
+0

真棒。有一件事。我想打破的符號(方法)是一件很常見的事情,所以它可能需要設置許多斷點。如何將命令附加到每個命令而無需手動執行100次? – 2011-06-01 19:49:57

0

不,這是不可能的。您只能勾選代碼和機器碼的符號。如果你想記錄輸出,你需要一個記錄功能。

如果您正在跟蹤特定錯誤,請嘗試使用條件斷點和監視變量。

編輯:

即使沒有直接洛也可能是使用GDB command files

+0

感謝您的回覆。我很難相信這是不可能的。我可以很容易地做一些事情,比如break hitTest:withEvent:,然後當它破解爲自我時,p指向我想要的信息。這怎麼能不自動讓gdb直接打印這些,而不讓我在每次斷裂時都實際告訴它呢? – 2011-06-01 19:22:31

+0

這聽起來很瘋狂,可能有機會使用某種宏執行你想要的操作,但它仍然不能直接記錄。結帳:http://tromey.com/blog/?p=548 – grundprinzip 2011-06-01 19:29:47

2

使用斷點像往常一樣,並設置宏登錄並繼續替代:

define c 
print "foo" 
cont 
c 
end 
+0

不錯。你能詳細說一下嗎?所以我可以在我的gdbinit文件中定義這個宏,但是如何告訴gdb在發生斷點時調用這個宏? – 2011-06-01 19:29:58

+0

只要你第一次打斷點就叫它。 – ninjalj 2011-06-01 19:52:52

+0

爲什麼'cont'和'c'在這裏不一樣? – daisy 2014-06-29 07:21:36