GDB是否有一个内置的脚本机制,我应该在代码了一个expect脚本,或者是有一个更好的解决方案了吗?
我会在每次发送相同的命令序列,我将每个命令的输出保存到一个文件中(最有可能使用GDB的内置日志机制,除非有人有更好的主意)。
GDB是否有一个内置的脚本机制,我应该在代码了一个expect脚本,或者是有一个更好的解决方案了吗?
我会在每次发送相同的命令序列,我将每个命令的输出保存到一个文件中(最有可能使用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
我正要过类似的东西,并用一个基本的例子上来-并且知道我会尽快忘掉它,我想我最好还是将它张贴:)
因此,我将它张贴在这里,因为它看起来关系到题。
基本上,在这个例子中,我希望自己能在代码的特定地方的一些变量值; 并让他们输出,直到程序崩溃。 因此,这里是第一这是一个小程序, 保证崩溃的几个步骤, 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
然后,我准备下面的脚本-这里的主要技巧是一个分配command
给每个breakpoint
,这将最终continue
(见自动化GDB:在每次调用显示回溯到函数将 )。 这个剧本我叫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,循环仍然纺纱只有两次(为的就是规范run
在gdb
脚本); 如果run
没有任何参数,它旋转一次(该程序的默认值)确认--args ./test.exe 5
被忽略。
但是,由于现在这是在一个单一的呼叫输出,并且无需任何用户交互,命令行输出可以很容易地在文本文件中使用所拍摄bash
重定向,说:
gdb --batch --command=test.gdb --args ./test.exe 5 > out.txt
也有使用Python在自动化GDB的例子Ç - GDB自动踏步-线的自动打印,而自由运行?
希望这可以帮助,
干杯!
如果有一个文件-x是你太多,只需要使用多个-EX的。 这是跟踪正在运行的程序表示(和保存)上崩溃回溯的例子
sudo gdb -p $(pidof my-app) -batch \
-ex "set logging on" \
-ex continue \
-ex "bt full" \
-ex quit