char* x
値が等しい文字列を指しているときにgdbを行xで中断するように指定できます"hello"
か?はいの場合、どのように?
3 に答える
あなたが使用することができますstrcmp
:
break x:20 if strcmp(y, "hello") == 0
20
行番号であり、x
任意のファイル名およびy
任意の変数にすることができます。
(GDB独自の便利な関数の1つ)でブレーク条件 を使用します。$_streq
break [where] if $_streq(x, "hello")
または、ブレークポイントがすでに存在する場合は、それに条件を追加します。
condition <breakpoint number> $_streq(x, "hello")
GDB 7.5(ずっと前)以降、 Python正規表現構文をサポートするものを含め、さまざまな文字列照合にそれと他のいくつかのネイティブの便利な関数を使用できます。$_regex
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
これらはstrcmp()
、プロセスのスタックに注入された通常の実行を実行するよりも問題が少なくなります。これは、望ましくない副作用が発生する可能性があるためです。
残念ながら、ネイティブ関数はPythonサポートでコンパイルされたGDBに依存しているため、常に使用できるとは限りません。これは通常デフォルトですが、制約のある環境ではこれがない場合があります。show configuration
確かに、 GDB内で実行し、を検索することで確認できます--with-python
。このシェルワンライナーもトリックを行います:
gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'
break x if ((int)strcmp(y, "hello")) == 0
一部の実装では、gdbがstrcmpの戻りタイプを認識しない場合があります。つまり、キャストする必要があります。そうしないと、常にtrueと評価されます。