如何查找库调用返回的位置?

时间:2011-09-02 08:33:23

标签: c++ debugging gdb fortran

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

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

我想到的一个想法是浏览源代码并找到所有可能的返回并在所有这些上设置断点。但还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

运行gdb,键入help nexthelp nexti,您可以看到next命令的说明,该命令基本上是您程序中的前进步骤。

你可以做的是,在函数的开头设置一个断点,然后从那里开始逐步运行程序(使用next)并查看它离开函数的位置。

如果程序很大,您可以二进制搜索返回点。这是在函数的开头设置一个断点,然后从那里键入例如next 500。如果你离开了这个功能,你就会走得太多,所以重新开始,然后下一步做一个小步骤,例如next 250。如果您还在使用该功能,您可以更多步骤并总结您的步骤以了解您的进展情况。因此,如果你说另一个时间next 500并且你不在函数中,那么你重新开始,这一次从next 750开始。你明白了。

编辑1:使用step代替next进入功能。

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

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

答案 1 :(得分:0)

您是否添加了-g3 -gdwarf-2标志?他们可能会提供额外的调试信息。

然后你可以进入程序的每一行,但我不知道它是否可以开箱即用于库