跟踪所有变量以在 gdb 中执行函数
Track all variables for execution of function in gdb
我想跟踪 C 函数中所有变量的状态。
我知道我可以在 gdb 中使用信息命令来获取当前上下文中的所有变量状态。
而且我可以使用 gdbinit 来自动化 gdb。
但我想做的是在函数处设置一个断点,然后在执行每一行打印后执行信息命令。
基本上,我想设置 2 个断点:一个在函数的开头,一个在同一函数的结尾(我不知道怎么做),然后在这两个断点之间逐行执行点.
我想要在我的 gdbinit
:
中有这样的东西
b <func_name>
commands
while <inside the function>:
info locals
next
end
run
有没有办法让 while 循环如上所示?
Basically, I want to set 2 breakpoints: one at the start of a function and one at the end of the same function(I don't know how to this) and execute line-by-line between these 2 points.
您可以找到如何在函数末尾设置断点here。但是,这里没有必要。
您可以使用$_caller_is()
GDB 便利函数来完成当前例程的执行,并在返回后停止。
示例:
int fn()
{
int sum = 0;
for (int j = 0; j < 5; j++) {
sum += j;
}
return sum;
}
int main()
{
return fn() - 10;
}
现在 GDB 会话:
gdb -q ./a.out
Reading symbols from ./a.out...
(gdb) b 4
Breakpoint 1 at 0x1130: file t.c, line 4.
(gdb) run
Starting program: /tmp/a.out
Breakpoint 1, fn () at t.c:4
4 for (int j = 0; j < 5; j++) {
(gdb) while $_caller_is("main")
>info locals
>next
>end
j = 1431654464
sum = 0
5 sum += j;
j = 0
sum = 0
4 for (int j = 0; j < 5; j++) {
j = 0
sum = 0
5 sum += j;
j = 1
sum = 0
4 for (int j = 0; j < 5; j++) {
j = 1
sum = 1
5 sum += j;
j = 2
sum = 1
4 for (int j = 0; j < 5; j++) {
j = 2
sum = 3
5 sum += j;
j = 3
sum = 3
4 for (int j = 0; j < 5; j++) {
j = 3
sum = 6
5 sum += j;
j = 4
sum = 6
4 for (int j = 0; j < 5; j++) {
j = 4
sum = 10
7 return sum;
sum = 10
8 }
sum = 10
main () at t.c:12
12 return fn() - 10;
(gdb) q
P.S。对于除了玩具问题之外的所有问题,这种调试方法都非常低效 并且 不足(很少有有趣的状态完全由局部变量捕获)。
我想跟踪 C 函数中所有变量的状态。
我知道我可以在 gdb 中使用信息命令来获取当前上下文中的所有变量状态。
而且我可以使用 gdbinit 来自动化 gdb。
但我想做的是在函数处设置一个断点,然后在执行每一行打印后执行信息命令。
基本上,我想设置 2 个断点:一个在函数的开头,一个在同一函数的结尾(我不知道怎么做),然后在这两个断点之间逐行执行点.
我想要在我的 gdbinit
:
b <func_name>
commands
while <inside the function>:
info locals
next
end
run
有没有办法让 while 循环如上所示?
Basically, I want to set 2 breakpoints: one at the start of a function and one at the end of the same function(I don't know how to this) and execute line-by-line between these 2 points.
您可以找到如何在函数末尾设置断点here。但是,这里没有必要。
您可以使用$_caller_is()
GDB 便利函数来完成当前例程的执行,并在返回后停止。
示例:
int fn()
{
int sum = 0;
for (int j = 0; j < 5; j++) {
sum += j;
}
return sum;
}
int main()
{
return fn() - 10;
}
现在 GDB 会话:
gdb -q ./a.out
Reading symbols from ./a.out...
(gdb) b 4
Breakpoint 1 at 0x1130: file t.c, line 4.
(gdb) run
Starting program: /tmp/a.out
Breakpoint 1, fn () at t.c:4
4 for (int j = 0; j < 5; j++) {
(gdb) while $_caller_is("main")
>info locals
>next
>end
j = 1431654464
sum = 0
5 sum += j;
j = 0
sum = 0
4 for (int j = 0; j < 5; j++) {
j = 0
sum = 0
5 sum += j;
j = 1
sum = 0
4 for (int j = 0; j < 5; j++) {
j = 1
sum = 1
5 sum += j;
j = 2
sum = 1
4 for (int j = 0; j < 5; j++) {
j = 2
sum = 3
5 sum += j;
j = 3
sum = 3
4 for (int j = 0; j < 5; j++) {
j = 3
sum = 6
5 sum += j;
j = 4
sum = 6
4 for (int j = 0; j < 5; j++) {
j = 4
sum = 10
7 return sum;
sum = 10
8 }
sum = 10
main () at t.c:12
12 return fn() - 10;
(gdb) q
P.S。对于除了玩具问题之外的所有问题,这种调试方法都非常低效 并且 不足(很少有有趣的状态完全由局部变量捕获)。