查找函数末尾的行号
finding line number of end of a function
当函数命中时,我正试图通过GDB打印函数的输入和输出来自动化一些调试。为了能够在这些地方设置断点,我正在执行以下操作。我正在使用模板和rbreak:。没有在我的文件中的函数处达到断点。因此,我从可执行文件中提取函数的行号,如下所示。
- 使用可执行文件,提取函数开始的行号
nm a.out |grep"className"|grep
-> this outputs the filename:linenumber
- 将这些内容添加到带有"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
指令添加断点,或者使用反向调试。我还没有尝试过这些选项。
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 使用用户定义的函数查找数字的幂时出现问题
- 如何处理具有不同类的成员函数的函数查找表?
- 如果我们没有在 C++ 中传递大小变量,则通过函数查找数组的大小
- 使用用户定义的函数查找完美数时出现浮点异常错误
- 使用 lambda 函数查找 std::unordered_map 中的最小值
- 重载函数查找轮廓的实例与参数列表不匹配
- 使用C++中的割线函数查找根
- JNA 程序函数查找失败
- 通过 C 加加号中的函数查找中位数
- 试图通过函数查找数组的最大值和最小值,其中数组值由用户输入
- xlC模板函数问题的静态函数查找
- 使用线程函数查找 2D 数组中的最大条目
- 如何在cpp中使用std::regex_replace()函数查找和替换
- 数组函数查找最大值
- 使用' stdio.h '函数查找模板和名称
- CPP字符串构造函数查找并附加空字符