什么是自动执行GDBdebugging会话的最佳方法?

GDB是否有一个内置的脚本机制,我应该编写一个期望的脚本,还是有更好的解决scheme吗?

我会每次发送相同的命令序列,并将每个命令的输出保存到一个文件(很可能使用GDB的内置日志logging机制,除非有人有更好的主意)。

gdb在运行后执行文件.gdbinit 。 所以你可以添加你的命令到这个文件,看看它是否适合你。 这是.gdbinit一个例子,为了打印所有f()调用的回溯:

 set pagination off set logging file gdb.txt set logging on file a.out bf commands bt continue end info breakpoints r set logging off quit 

我刚刚经历了类似的事情,并提出了一个基本的例子 – 知道我很快就会忘记它,我想我最好把它发布:)所以我会张贴在这里,因为它看起来有关题。

基本上,在这个例子中,我想在代码的特定位置获得一些variables值; 并让他们输出,直到程序崩溃。 所以这里是第一个保证在几个步骤中崩溃的小程序, 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; } 

程序接受命令行参数的唯一原因是能够在崩溃之前select步骤的数量,并显示gdb忽略批处理模式下的--args 。 这我编译:

 gcc -g test.c -o test.exe 

然后,我准备下面的脚本 – 这里的主要技巧是给每个breakpoint分配一个command ,这个command最终会continue (参见每次调用函数puts时自动化gdb:show backtrace )。 这个脚本我称之为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 pi pb continue end # int b = line - cmd3 b test.c:16 commands 3 pi pb 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 

请注意,如果您打算以批处理模式使用它,则必须在最后“启动”脚本,使用runstart或类似的方法。

有了这个脚本,我可以在批处理模式下调用gdb – 这将在terminal中生成以下输出:

 $ 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; 

请注意,尽pipe我们指定了命令行参数5,但循环仍然只会旋转两次(就像在gdb脚本中run的规范一样); 如果run没有任何参数,它只会旋转一次(程序的默认值),确认--args ./test.exe 5被忽略。

但是,由于现在这是一次调用输出,并且没有任何用户交互,命令行输出可以很容易地使用bashredirect在文本文件中捕获,例如:

 gdb --batch --command=test.gdb --args ./test.exe 5 > out.txt 

还有一个使用python自动执行gdb的例子,在c – GDB自动步进 – 自动打印行,而自由运行?

希望这可以帮助,
干杯!

如果带有文件的-x太多了,只需要使用多个-ex。 这是一个跟踪正在运行的程序在崩溃时显示(和保存)回溯的例子

 sudo gdb -p $(pidof my-app) -batch \ -ex "set logging on" \ -ex continue \ -ex "bt full" \ -ex quit