gpt4 book ai didi

scripting - 自动化 GDB 调试 session 的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-02 22:10:11 24 4
gpt4 key购买 nike

GDB 是否有内置的脚 native 制,我应该编写一个 Expect 脚本,还是有更好的解决方案?

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

最佳答案

基本上,在这个例子中,我想在代码的特定位置获取一些变量值;并让它们输出直到程序崩溃。首先是一个小程序 guaranteed to crash只需几个步骤,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

然后,我准备以下脚本 - 这里的主要技巧是为每个断点分配一个命令,这最终将继续(另请参见 Automate gdb: show backtrace at every call to function puts )。我将此脚本称为 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

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

使用此脚本后,我可以在批处理模式下调用 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 时,循环仍然只旋转两次(与 gdb 脚本中 run 的规范相同);如果 run 没有任何参数,它仅旋转一次(程序的默认值),确认 --args ./test.exe 5 被忽略。

但是,由于现在这是在单个调用中输出,并且无需任何用户交互,因此可以使用 bash 重定向轻松地将命令行输出捕获到文本文件中,例如:

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

c - GDB auto stepping - automatic printout of lines, while free running? 中还有一个使用 python 自动化 gdb 的示例

关于scripting - 自动化 GDB 调试 session 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10748501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com