web-dev-qa-db-ja.com

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

char* x"hello"に等しい値の文字列を指すときにgdbを行xで分割するように指定できますか?はいの場合、どのように?

156
341008

strcmpを使用できます:

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

20は行番号、xは任意のファイル名、yは任意の変数です。

192
Nathan Fellman
break x if ((int)strcmp(y, "hello")) == 0

一部の実装では、gdbはstrcmpの戻り値の型を知らない場合があります。それはあなたがキャストしなければならないことを意味します、さもなければそれは常に真と評価されるでしょう!

52
Tobias Domhan

GDB 7.5以降 これらの便利なものを使用できます 便利な関数

$_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は文字列全体にのみ一致するため、さらに巧妙なものが必要な場合は、 Python正規表現構文 をサポートする$_regexを使用する必要があります。

33
tlwhitec