2009-01-24 51 views
17

中的任何函數時,我想知道在使用某個文件中的函數時是否有任何方法來停止程序。理想的情況是什麼,我期待的是一樣的東西:使用gdb停止程序,當它使用文件X

GDB Stop when use a function from file foo.cpp 

之所以這樣做是因爲我調試的代碼,是不是我的,我不知道到底是什麼功能都被稱爲什麼功能都沒有。在GDB中是否有一個函數來執行我正在尋找的任務,或者是否有其他建議的方法來執行類似的操作?

感謝

+0

請接受:http://stackoverflow.com/a/478145/895245,它完全符合您當前GDB的需求。 – 2015-07-18 07:45:02

回答

21

步驟1:構建的,我能想到的foo.cpp
最簡單的方法定義的所有功能的列表(假設你有binutils和GNU grep):

nm a.out | grep ' T ' | addr2line -fe a.out | 
    grep -B1 'foo\.cpp' | grep -v 'foo\.cpp' > funclist 

第2步:建立一個GDB腳本將設置中斷點上的每個上述功能:

sed 's/^/break /' funclist > stop-in-foo.gdb 

[顯然,步驟1和2可以被組合; - ]

3步:實際設置斷點:

gdb a.out 
(gdb) source stop-in-foo.gdb 

看着this答案,一個更簡單的(如果你在Fedora Linux系統)的方式,找出Foo.cpp中函數的調用其中:

ftrace -sym='foo.cpp#*' ./a.out 

太壞ftrace手冊頁說這還沒有實現。

+0

我打算說這樣做,但實際上是+1。 =) – 2009-01-25 19:03:11

+1

似乎沒有拿起靜態函數。 – 2012-08-13 11:11:42

0

GDB斷點有幾個語法的... See here.

這不會對雖然文件中的任何功能突破....

編輯:你可以做些什麼愚蠢的像使所有函數調用虛函數void foo(void)和內部斷點。至少你會在文件內部破碎,並且應該很容易找到文件X的哪個函數被調用。

+0

foo函數並不是一個壞主意,問題是我有很多方法和文件,我可以使用的唯一選擇是rbreak正則表達式。謝謝 – Eduardo 2009-01-24 01:37:32

2

就業俄羅斯的回答看起來很不錯,但既然你說:

我不知道到底是什麼功能 都被稱爲什麼功能都沒有 。

會的報告,其功能被擊中,通過爲gcov或東西代碼覆蓋工具,例如涉及Valgrind產生是一個很好的解決問題了嗎?對正則表達式的正則表達式的所有功能

break foo.cpp:function-name 
1

可以使用命令。該命令在所有匹配項上設置無條件斷點,並打印它設置的所有斷點列表。一旦設置了這些斷點,就會像使用break命令設置的斷點一樣對待它們。您可以刪除它們,禁用它們,或者使其條件與其他任何斷點相同。

正則表達式的語法是與`grep'這樣的工具一起使用的標準語法。請注意,這與shell所使用的語法不同,因此,例如,foo *會匹配所有包含fo,後跟零個或多個os的函數。有一個隱含的。*前導和尾隨你提供的正則表達式,所以只匹配以foo開頭的函數,請使用^ foo。

在調試C++程序時,rbreak對於在不是任何特殊類的成員的重載函數上設置斷點很有用。

+0

這隻會打破一個功能,但問題在於所有功能。 – Herbert 2017-01-12 22:12:46

10

rbreak regex

設置斷點:

1

rbreak foo.cpp:.

這裏.匹配任何東西,並在文件foo.cpp的所有功能,所以休息。

相關問題