例如,请考虑以下调试会话:
(gdb) break foo
Breakpoint 1 at 0x4004f1: file tst.c, line 5.
(gdb) run
Starting program: /tmp/tst
Breakpoint 1, foo () at tst.c:5
5 return ary[i++];
(gdb) finish
Run till exit from #0 foo () at tst.c:5
Value returned is $1 = 1
(gdb) cont
Continuing.
Breakpoint 1, foo () at tst.c:5
5 return ary[i++];
(gdb) finish
Run till exit from #0 foo () at tst.c:5
Value returned is $2 = 3
执行finish
命令后,我得到分配给a的返回值
便利变量(例如$1
或$2
)。不幸的是,每次都是命令
执行后,该值将分配给另一个变量。那就是问题所在,
我不能编写一个检查返回值的脚本,因为我不知道
该值赋值的变量是什么。
为什么我需要那个?我想在某个函数上设置一个断点但是 仅当函数返回特定值时才停止程序执行。某物 像这样:
break foo
commands
finish
if ($return_value != 42)
continue;
end
end
所以问题是:有没有办法在脚本中检查返回的值 从功能?
答案 0 :(得分:1)
从gdb CLI开始,这并不容易。也许纯粹使用传统的CLI是不可能的 - 因为你可以在断点的命令中使用劣等的控制命令,如Navigator
。这是一个长期存在的gdb问题。
但是,像gdb中的大多数自动化问题一样,它可以使用Python API解决。现在,不幸的是,这种方法需要你做一些工作。
基本上你想要做的是将Python FinishBreakpoint class子类化,让它做你想做的事。特别是你想编写一个新命令,在某个函数中设置一个常规断点;然后当这个断点被击中时,它将实例化你的新finish
类。您的类将使用FinishBreakpoint
方法,根据您的喜好使用结束断点的stop
。
答案 1 :(得分:0)
问题的第一部分很简单:只需使用$
访问gdb值历史记录中的最新值。
打印的值由历史编号提供,您可以通过这些编号来引用它们。这些是以1开头的连续整数。 print通过在值之前打印'$ num ='来显示分配给值的历史编号;这里num是历史编号。
要引用任何先前的值,请使用“$”后跟值的历史记录编号。打印标签的输出方式旨在提醒您这一点。 只是$表示历史记录中的最新值,$$表示之前的值。 $$ n指的是结尾的第n个值。
但是,当前可能无法在断点命令列表中执行finish
命令之后的命令;请参阅Tom Tromey's answer了解解决方法。