如何将函数返回的值赋值给GDB脚本中的变量?

时间:2015-11-19 12:09:12

标签: debugging gdb

例如,请考虑以下调试会话:

(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

所以问题是:有没有办法在脚本中检查返回的值 从功能?

2 个答案:

答案 0 :(得分:1)

从gdb CLI开始,这并不容易。也许纯粹使用传统的CLI是不可能的 - 因为你可以在断点的命令中使用劣等的控制命令,如Navigator。这是一个长期存在的gdb问题。

但是,像gdb中的大多数自动化问题一样,它可以使用Python API解决。现在,不幸的是,这种方法需要你做一些工作。

基本上你想要做的是将Python FinishBreakpoint class子类化,让它做你想做的事。特别是你想编写一个新命令,在某个函数中设置一个常规断点;然后当这个断点被击中时,它将实例化你的新finish类。您的类将使用FinishBreakpoint方法,根据您的喜好使用结束断点的stop

答案 1 :(得分:0)

问题的第一部分很简单:只需使用$访问gdb值历史记录中的最新值。

来自GDB: Value History

  

打印的值由历史编号提供,您可以通过这些编号来引用它们。这些是以1开头的连续整数。 print通过在值之前打印'$ num ='来显示分配给值的历史编号;这里num是历史编号。

     

要引用任何先前的值,请使用“$”后跟值的历史记录编号。打印标签的输出方式旨在提醒您这一点。 只是$表示历史记录中的最新值,$$表示之前的值。 $$ n指的是结尾的第n个值。

但是,当前可能无法在断点命令列表中执行finish命令之后的命令;请参阅Tom Tromey's answer了解解决方法。