c++ - 如何找到库调用返回的位置?

标签 c++ debugging gdb fortran

我正在分析一个非常庞大的外部 FORTRAN 库。无论如何,库的全部意义在于为我提供的函数拟合参数值。入口点是一个带有 godzillion 参数的方法调用。

问题是,有时调用返回的速度非常快,它吐出的参数值也可能来自随机数生成器。问题是:在 gdb(或其他调试器)中是否有任何方法可以查看调用库方法返回的位置?我确实有源代码并且已经用 -g 编译了它们。顺便说一句,我使用 g++gfortran 进行编译。我无法手动查看源代码或逐行执行它,因为整个代码是 ~ 10k行的困惑代码。

我想到的一个想法是遍历源代码并找到所有可能的返回值并在所有这些返回值上设置断点。但是还有别的办法吗?

最佳答案

运行 gdb,键入 help nexthelp nexti,您可以看到 next 命令的描述,它基本上在您的程序中向前推进.

你可以做的是,在函数的开头设置一个断点,然后从那里一步步运行程序(使用next),看看它从哪里跳出函数.

如果程序很大,可以二分查找返回点。即在函数的开头设置一个断点,然后从那里键入例如 next 500。如果您从函数中退出,则说明步进过多,因此请重新开始并在下次执行较小的步进,例如 next 250。如果你还在函数中,你可以多走几步,总结一下你的步骤,看看你走了多远。因此,如果您再次说 next 500 而您超出了该功能,您将重新开始,这次从 next 750 开始。你明白了。

编辑 1:使用 step 而不是 next 进入函数内部。

编辑 2:试试看是否有效:

在函数的开头打一个 break 并进入函数内部。然后(当然是在 gdb 中)键入 finish 以运行直到函数完成。然后(这是我不确定它是否能正常工作的部分),键入 reverse-step 并在执行过程中倒退以查看函数退出的位置! (这有多酷?!)

关于c++ - 如何找到库调用返回的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7280992/

相关文章:

c# - 调试返回值

c++ - GDB设置断点时未定义函数 "d::~d"

python - GDB pretty-print : returning string from a children()'s iterator, 但显示为 char[]

c++ - gdb,连接到使用 gdbserver 启动的正在运行的进程

wpf - ListBox.DisplayMemberPath 未按预期工作。我该如何调试呢?

c++ - 原子读取是否保证读取到最新值?

c++ - 通过取消引用 NULL 指针来分配引用

android - 在Android的OpenGL ES中运行时创建大型纹理的最有效方法

visual-studio-2010 - 在VS2010中将调试器的调用栈(方法名)打印到文件或控制台

c++ - KSP( key 存储提供程序)未通过凭据提供程序在登录时加载