查找函数末尾的行号

finding line number of end of a function

本文关键字:函数 查找      更新时间:2024-05-23

当函数命中时,我正试图通过GDB打印函数的输入和输出来自动化一些调试。为了能够在这些地方设置断点,我正在执行以下操作。我正在使用模板和rbreak:。没有在我的文件中的函数处达到断点。因此,我从可执行文件中提取函数的行号,如下所示。

  1. 使用可执行文件,提取函数开始的行号

nm a.out |grep"className"|grep

-> this outputs the filename:linenumber
  1. 将这些内容添加到带有"b前缀"的.gdb文件中

查询-我们如何从可执行文件中提取函数末尾的行号

有了这些信息,我可以将其添加到GDB脚本中,最终脚本将看起来像下面这样。该脚本将在程序的执行。

b filepath:<startline of function>
commands
print input1 input2 etc
continue 
end
b filepath:<endline of function>
commands
print output1 output2 etc
continue 
end

它仍然是只找到属于类/文件的给定函数的结束行,给定函数的可执行文件和开始行

我还考虑过使用GDBsfinish命令,但控制权已经回到了调用方。在被调用的函数中而不是在调用者中进行打印会很容易,这样我们就可以监视函数的每个调用的输入/输出。这将在很大程度上简化我的调试。

如有任何建议/意见,我们将不胜感激。提前感谢!!

首先,请注意,模板函数不是函数,而是配方。使用模板时,编译器会根据模板生成一个函数。

如果要使用break命令,则需要完整的函数名称。例如,下面的模板

template <typename T>
inline T doubleInput(const T& x) {
return 2 * x;
}

当您传递int时,将变为函数doubleInput<int>,当您传递double时,将变成函数doubleInput<double>,等等。您需要包括<type>部分在内的整个名称来使用break命令添加断点,即使在这种情况下,它也只会在模板的特定情况下停止。

但是rbreak命令确实适用于模板。如果您在gdbrbreak doubleInput*中编写,则会在模板的所有现有专业化中添加一个断点。

看看这个问题的答案。


我不知道gdb现在是否有在函数返回中添加断点的功能,但这个九年前的问题的答案提供了一些可能性,包括一个自定义的python命令来查找并向retq指令添加断点,或者使用反向调试。我还没有尝试过这些选项。