2010-11-15 133 views

回答

153

您可以使用strcmp

break x:20 if strcmp(y, "hello") == 0 

20是行號,x可以是任意文件名和y可以是任何變量。

+6

注意:您必須已經運行該程序,以便GDB可以看到stdlib。否則:在當前上下文中沒有符號「strcmp」。# – 2015-07-27 20:45:49

+0

@ naive231通過「看」我的意思是看功能,所以你可以打破他們,而不是來源:你必須擊中'運行',以便動態庫加載。對於源,谷歌它,並找到:http://stackoverflow.com/questions/10000335/how-to-use-debug-version-of-libc :-) – 2015-11-13 09:52:01

39
break x if ((int)strcmp(y, "hello")) == 0 

在一些實現上,gdb可能不知道strcmp的返回類型。這意味着你將不得不施放,否則它總會評估爲真!

10

Since GDB 7.5,您可以使用這些方便Convenience Functions

$_memeq(buf1, buf2, length)` 
$_streq(str1, str2) 
$_strlen(str) 
$_regex(str, regex) 

顯得相當不必執行「洋」 strcmp()的過程中少問題每個斷點被擊中一次堆疊。

注意你的GDB需要用Python支持進行編譯,這對當前的linux發行版來說不是問題。可以肯定的是,您可以通過在GDB中運行show configuration並搜索--with-python來檢查它。這個小oneliner的伎倆,太:

$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' 
      --with-python=/usr (relocatable) 

爲您演示的情況下,使用將

break <where> if $_streq(x, "hello") 

,或者,如果你的斷點已經存在,你只是想添加條件它

condition <breakpoint number> $_streq(x, "hello") 

$_streq只匹配整個str所以如果你想要更狡猾的東西,你應該使用$_regex,它支持Python regular expression syntax

相關問題