GDB には組み込みのスクリプト メカニズムがありますか? Expect スクリプトをコーディングする必要がありますか? それとも、さらに優れたソリューションがありますか?
毎回同じ一連のコマンドを送信し、各コマンドの出力をファイルに保存します (誰かがより良いアイデアを持っていない限り、おそらく GDB の組み込みログ メカニズムを使用します)。
GDB には組み込みのスクリプト メカニズムがありますか? Expect スクリプトをコーディングする必要がありますか? それとも、さらに優れたソリューションがありますか?
毎回同じ一連のコマンドを送信し、各コマンドの出力をファイルに保存します (誰かがより良いアイデアを持っていない限り、おそらく GDB の組み込みログ メカニズムを使用します)。
基本的に、この例では、コードの特定の場所でいくつかの変数値を取得したかったのです。プログラムがクラッシュするまで出力します。いくつかのステップでクラッシュすることが保証されている最初の小さなプログラムを次に示しtest.c
ます。
#include <stdio.h>
#include <stdlib.h>
int icount = 1; // default value
main(int argc, char *argv[])
{
int i;
if (argc == 2) {
icount = atoi(argv[1]);
}
i = icount;
while (i > -1) {
int b = 5 / i;
printf(" 5 / %d = %d \n", i, b );
i = i - 1;
}
printf("Finished\n");
return 0;
}
プログラムがコマンドライン引数を受け入れる唯一の理由は、クラッシュするまでのステップ数を選択できるようにすることと、バッチ モードでそれがgdb
無視されることを示すことです。--args
これは私がコンパイルします:
gcc -g test.c -o test.exe
次に、次のスクリプトを準備します。ここでの主なトリックは、 each に a を割り当てることですcommand
。breakpoint
これは最終的に実行されます ( gdb の自動化: 関数 puts の呼び出しごとにバックトレースを表示するcontinue
も参照してください)。私が呼び出すこのスクリプト:test.gdb
# http://sourceware.org/gdb/wiki/FAQ: to disable the
# "---Type <return> to continue, or q <return> to quit---"
# in batch mode:
set width 0
set height 0
set verbose off
# at entry point - cmd1
b main
commands 1
print argc
continue
end
# printf line - cmd2
b test.c:17
commands 2
p i
p b
continue
end
# int b = line - cmd3
b test.c:16
commands 3
p i
p b
continue
end
# show arguments for program
show args
printf "Note, however: in batch mode, arguments will be ignored!\n"
# note: even if arguments are shown;
# must specify cmdline arg for "run"
# when running in batch mode! (then they are ignored)
# below, we specify command line argument "2":
run 2 # run
#start # alternative to run: runs to main, and stops
#continue
バッチモードで使用する場合は、最後にスクリプトを「起動」する必要があることに注意してrun
くださいstart
。
このスクリプトを配置するとgdb
、バッチ モードで呼び出すことができます。これにより、ターミナルに次の出力が生成されます。
$ gdb --batch --command=test.gdb --args ./test.exe 5
Breakpoint 1 at 0x804844d: file test.c, line 10.
Breakpoint 2 at 0x8048485: file test.c, line 17.
Breakpoint 3 at 0x8048473: file test.c, line 16.
Argument list to give program being debugged when it is started is "5".
Note, however: in batch mode, arguments will be ignored!
Breakpoint 1, main (argc=2, argv=0xbffff424) at test.c:10
10 if (argc == 2) {
$1 = 2
Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16
16 int b = 5 / i;
$2 = 2
$3 = 134513899
Breakpoint 2, main (argc=2, argv=0xbffff424) at test.c:17
17 printf(" 5 / %d = %d \n", i, b );
$4 = 2
$5 = 2
5 / 2 = 2
Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16
16 int b = 5 / i;
$6 = 1
$7 = 2
Breakpoint 2, main (argc=2, argv=0xbffff424) at test.c:17
17 printf(" 5 / %d = %d \n", i, b );
$8 = 1
$9 = 5
5 / 1 = 5
Breakpoint 3, main (argc=2, argv=0xbffff424) at test.c:16
16 int b = 5 / i;
$10 = 0
$11 = 5
Program received signal SIGFPE, Arithmetic exception.
0x0804847d in main (argc=2, argv=0xbffff424) at test.c:16
16 int b = 5 / i;
コマンド ライン引数 5 を指定しても、ループは 2 回しかスピンしないことに注意してください (スクリプトrun
での の指定と同様)。引数がないgdb
場合は、1 回だけ (プログラムのデフォルト値) スピンし、無視されることを確認します。run
--args ./test.exe 5
ただし、これは単一の呼び出しで出力されるため、ユーザーの操作は必要ないため、bash
リダイレクトを使用してコマンド ライン出力をテキスト ファイルに簡単にキャプチャできます。たとえば、次のようにします。
gdb --batch --command=test.gdb --args ./test.exe 5 > out.txt
Cでgdbを自動化するためにPythonを使用する例もあります-GDB自動ステッピング-フリーランニング中の行の自動出力?
これが役に立てば幸いです、
乾杯!
gdb
実行後にファイル.gdbinit
を実行します。したがって、コマンドをこのファイルに追加して、問題がないかどうかを確認できます。.gdbinit
これは、すべてのf()
呼び出しのバックトレースを出力するための例です:
set pagination off
set logging file gdb.txt
set logging on
file a.out
b f
commands
bt
continue
end
info breakpoints
r
set logging off
quit