181

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

4

3 に答える 3

217

あなたが使用することができますstrcmp

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

20行番号であり、x任意のファイル名およびy任意の変数にすることができます。

于 2010-11-15T11:27:15.077 に答える
68

(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'
于 2017-05-10T12:46:33.040 に答える
58
break x if ((int)strcmp(y, "hello")) == 0

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

于 2012-03-22T09:16:46.537 に答える