6

私は巨大なコードベースを操作していて、特にゼロに設定されたときに、特定の変数の値(ファイルの1つの奥深くに埋め込まれている)を監視したいと考えています。

1)変数がグローバルスコープに属していない。最初に変数が定義されている関数にブレークポイントを設定してからウォッチポイントを設定するよりも良いオプションはありますか?
2)1のオプションを試した後、これを使用したフレーム外と言ってしばらくするとウォッチポイントが削除されることがわかります。このように、何度も追加する必要があるため、手順が面倒になります。回避策はありますか?
3)特定の変数が0(または特定の定数)に等しいかどうかを確認する方法はありますか?

4

2 に答える 2

9

特定の変数の値を監視したい

多くの場合、これは、特に大規模なコードベースでは、最善のアプローチではありません。

あなたが本当にやりたいと思うのは、不変条件を理解し、コードのさまざまな部分への入り口と出口でそれらが真であると主張することです。

1)変数がグローバルスコープに属していない。最初に変数が定義されている関数にブレークポイントを設定してからウォッチポイントを設定するよりも良いオプションはありますか?

いいえ。自動(スタック)変数の場合、変数が「アクティブ」であるスコープ内にある必要があります。

できることは、ある行にブレークポイントを設定し、そのブレークポイントにコマンドをアタッチして、ウォッチポイントを自動的に設定することです。

(gdb) break foo.c:123
(gdb) commands 1
      silent
      watch some_local
      continue
      end

3)特定の変数が0に等しいかどうかを確認する方法はありますか?

ウォッチポイントを使用してこれを行うことはできませんが、条件付きブレークポイントを使用して行うことはできます。

(gdb) break foo.c:234 if some_local == 0
于 2011-09-13T04:30:39.423 に答える
0

Linuxを使用していると仮定します。あなたはこれを試すことができます:

最初のステップは、次のように変数を静的にすることです。

static int myVar;

次に、-ggdbを使用してコードをコンパイルした後、次のようにバイナリ内の変数のアドレスを検出する必要があります(例として実際のケースを使用しました)。

readelf -s pdv | grep tmp | c ++ filt

私の状況では、出力は次のとおりです。

47:081c14744オブジェクトローカルデフォルト25startProc(int):: tmp

この場合のアドレスは081c1474です。これで、GDB内にウォッチポイントを設定できます。

時計*0x081c1474

正しいアドレスの前にある「*0x」に注意してください。

私はこの質問が古いことを知っていますが、とにかくそれが役立つことを願っています。

于 2015-01-23T18:12:19.267 に答える