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

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,debugging,gdb,Debugging,Gdb,在执行finish命令后,我得到分配给 方便变量(例如$1或$2)。不幸的是,每次 执行时,将该值分配给不同的变量。这就是问题所在, 我无法编写检查返回值的脚本,因为我不知道 该值分配给哪个变量 为什么我需要这个?我想在某个函数上设置断点,但是 仅当函数返回特定值时才停止程序执行。某物 像这样: break foo commands finish if ($return_value != 42) continue; end end 所以问题是:有没有办法在脚本中检查返回的值

在执行
finish
命令后,我得到分配给 方便变量(例如
$1
$2
)。不幸的是,每次 执行时,将该值分配给不同的变量。这就是问题所在, 我无法编写检查返回值的脚本,因为我不知道 该值分配给哪个变量

为什么我需要这个?我想在某个函数上设置断点,但是 仅当函数返回特定值时才停止程序执行。某物 像这样:

break foo
commands
  finish
  if ($return_value != 42)
    continue;
  end
end
所以问题是:有没有办法在脚本中检查返回的值
从函数?

从gdb CLI执行此操作并不容易。也许纯粹使用传统的CLI是不可能的——因为在断点的命令中可以使用诸如
finish
之类的低级控制命令。这是一个长期存在的gdb问题

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


本质上,您要做的是对Python进行子类化,让它做您想做的事情。特别是,您希望编写一个新命令,在某些函数中设置一个常规断点;然后,当命中此断点时,它将实例化新的
FinishBreakpoint
类。您的类将有一个
stop
方法,该方法将根据您的喜好使用finish断点的
返回值。

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

打印的值是给定的历史编号,您可以通过这些编号引用这些值。这些是从1开始的连续整数。print通过在值之前打印“$num=”来显示分配给该值的历史编号;这里num是历史编号

若要引用任何以前的值,请使用“$”后跟该值的历史编号。打印标签的输出方式旨在提醒您这一点Just$表示历史记录中最近的值,$$表示之前的值$$n指从末尾算起的第n个值


但是,在断点命令列表中执行
finish
命令之后的命令当前可能不可行;有关解决方法,请参阅。

您可以使用
$
访问gdb中的最新值。但是,我不知道是否可以在断点命令列表中包含在
finish
命令之后实际运行的命令。哇!我尝试了十几种不同的组合,比如$或$?但事实证明,这要简单得多。然而,在
finish
命令之后,似乎确实不再执行任何命令。无论如何,如果你把你的评论转换成一个答案,我会把它标记为正确的答案。是的,我知道用python是可能的。但我很好奇,是否可以从命令行界面以交互模式进行。