2009-08-25 3 views
6

私はアプリケーションを持っています。私はソースコードを(C言語で)持っています。とにかく私はそれをコンパイルすることができます。私が望むツールをそれに加えてください。しかし、私はprintfの束とソースコードを唐辛子にしたくありません。私は、特定の値(例えば、グローバル構造のメンバーの一部)が書き込まれたとき(その値が変更されたとき)を示す何らかのログを生成できるようにしたい。ソースファイルと行番号、古い値と新しい値を表示できるようにしたいと思います。gdbトレース(または同様のもの)のヘルプ

住所ではなく名前で指定することもできます。しかし、アドレスはOKです。ボーナスは、関数にローカルな値を指定できるかどうかを示します。

私はまだgdbのトレースコマンドを見つけようとしています。どんな助けでも大歓迎です。ありがとう。

答えて

1

@derobertと@peterの両方に感謝します。ついにこれに戻りました:

break main 
commands 
     watch somevar 
     commands 
       cont 
     end 
     cont 
end 
run 

トリックします。これは、 "somevar"がグローバルである場合、または "main"にローカルの場合に機能します。 "somevar"が他の関数のローカルな場合は、上記の関数名で "main"を置き換えてください。

ファイル(例えば「gdbscript」)にこれらのコマンドを入れなどの実行GDB:

gdb -x gdbscript a.out 
6

まず、プログラムをデバッグシンボルでコンパイルし、おそらくgdbを最も有効にするためのw/o最適化を行う必要があります。 gccの場合、それは-g -O0になります。

第2に、探している機能はトレースではなく、ウォッチポイントです。

(gdb) help watch 
Set a watchpoint for an expression. 
A watchpoint stops execution of your program whenever the value of 
an expression changes. 

だから、いくつかのサンプルコードを与えられた:

int main() { 
    int a; 
    a = 1; 
    a = 2; 
    return 0; 
} 

あなたはそれでGDBを実行することができますし、そして:それが原因スタック上にあることに少し面白い働いて

(gdb) b main 
Breakpoint 1 at 0x80483a5: file test.c, line 4. 
(gdb) run 
Starting program: /tmp/test 

Breakpoint 1, main() at test.c:4 
4    a = 1; 
(gdb) watch a 
Hardware watchpoint 2: a 
(gdb) c 
Continuing. 
Hardware watchpoint 2: a 

Old value = -1207552288 
New value = 2 
main() at test.c:8 
8    return 0; 

、メモリではありません。また、最適化がオンになっていれば、それはさらに少なくて済みます。最適化されます。

+1

は例がよりよく機能させることがあり、 '揮発性int'、として' A'を宣言してください。 – caf

+0

ありがとうございました。私が時計について理解していることは、ユーザーが「続ける」までプログラムの実行を停止させることです。私はこれを行うための期待スクリプトを書くことができると確信していますが、gdbの中からこれを自動的に行うための方法がありますか? – tvaughan

+0

@tvaughan:私はgdbの中で自動的に行う方法を知らない。 – derobert

3

すでに述べたように、変数にウォッチポイントを設定する必要があります。

ザ・あなたは

(gdb) help commands 
Set commands to be executed when a breakpoint is hit. 
Give breakpoint number as argument after "commands". 
With no argument, the targeted breakpoint is the last one set. 
The commands themselves follow starting on the next line. 
Type a line containing "end" to indicate the end of them. 
Give "silent" as the first line to make the breakpoint silent; 
then no output is printed when it is hit, except what the commands print. 

だから、「コマンド」コマンドを使用し、watchコマンドからウォッチポイントの番号を見つけ、これを行うと仮定すると、

(gdp) commands 2 
> print a 
> cont 
> end 

(あなたの時計を想定して第2のブレークです) aは必要な変数です。とにかくgdbの出力に満足すれば、印刷行を省略することができます。

元のブレークポイントのコマンドを使用してウォッチポイントを設定し、続行することもできます。

関連する問題