char* x
が"hello"
に等しい値の文字列を指すときにgdbを行xで分割するように指定できますか?はいの場合、どのように?
strcmp
を使用できます:
break x:20 if strcmp(y, "hello") == 0
20
は行番号、x
は任意のファイル名、y
は任意の変数です。
break x if ((int)strcmp(y, "hello")) == 0
一部の実装では、gdbはstrcmpの戻り値の型を知らない場合があります。それはあなたがキャストしなければならないことを意味します、さもなければそれは常に真と評価されるでしょう!
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
を使用する必要があります。