我正在分析一个非常庞大的外部 FORTRAN 库。无论如何,库的全部意义在于为我提供的函数拟合参数值。入口点是一个带有 godzillion 参数的方法调用。
问题是,有时调用返回的速度非常快,它吐出的参数值也可能来自随机数生成器。问题是:在 gdb(或其他调试器)中是否有任何方法可以查看调用库方法返回的位置?我确实有源代码并且已经用 -g
编译了它们。顺便说一句,我使用 g++
和 gfortran
进行编译。我无法手动查看源代码或逐行执行它,因为整个代码是 ~ 10k
行的困惑代码。
我想到的一个想法是遍历源代码并找到所有可能的返回值并在所有这些返回值上设置断点。但是还有别的办法吗?
最佳答案
运行 gdb,键入 help next
或 help 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/