char * xが値が「hello」に等しい文字列を指す場合、gdbに条件付きブレークポイントを設定するにはどうすればよいですか?


回答:


198

使用できますstrcmp

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

20行番号で、x任意のファイル名とy任意の変数を指定できます。


9
注:GDBがstdlibを参照できるように、プログラムをすでに実行している必要があります。それ以外の場合:No symbol "strcmp" in current context.
Ciro Santilli郝海东冠状病六四事件法轮功

1
@CiroSantilli六四事件法轮功包卓轩:gdbを構成してstdlibを表示する方法
naive231 2015年

@ naive231 by "see"ソースではなく、関数を壊すことができるように、関数を参照することを意味しますrun。動的ライブラリが読み込まれるように、それを実行する必要があります。ソースについては、それを
ググって

1
この方法には副作用があります。$_streq@tlwhitecのメソッドの方が優れています。
rools

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

一部の実装では、gdbはstrcmpの戻り型を認識しない場合があります。つまり、キャストする必要があります。そうしないと、常にtrueと評価されます。


46

GDB 7.5以降、次のネイティブの便利な関数を使用できます。

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

strcmp()ブレークポイントに到達するたびにプロセスのスタックで「外部」を実行する必要がある場合よりも、問題はかなり少ないようです。これは、マルチスレッドプロセスのデバッグに特に当てはまります。

GDBはPythonサポートでコンパイルする必要があることに注意してください。これは、現在のLinuxディストリビューションでは問題ではありません。確かに、show configurationGDB内で実行してを検索することで確認できます--with-python。この小さなワンライナーもトリックを行います:

$ 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文字列全体にのみ一致するので、より狡猾なものが必要な場合は$_regexPython正規表現構文をサポートするを使用する必要があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.