从堆栈跟踪中查找共享库中的源代码行

Posted

技术标签:

【中文标题】从堆栈跟踪中查找共享库中的源代码行【英文标题】:Find source line in shared library from stack trace 【发布时间】:2017-03-27 06:57:06 【问题描述】:

我有一个长时间运行的程序在 9 小时后出现(可能是间歇性的)分段错误,而我只有一个堆栈跟踪。我想找到发生分段错误的源代码行。

段错误发生在使用 ctypes 从 Python 调用的 C++ 模块(使用 OpenMP)中。 C++ 模块是在 linux 上使用调试符号编译的。 Python 程序本身在 OpenMPI 下运行,这使得调试更具挑战性,而且我没有核心转储。

堆栈跟踪的顶部在下面。我有兴趣找出关于源代码行_ZN13BackbonePairs13compute_valueE11ComputeMode+0x5e1 的任何信息。这显然是我的 BackbonePairs::compute_value 函数,但该函数中没有线程启动,所以我不确定堆栈跟踪中的 libpthread。

[midway2-0015:35095] *** Process received signal ***
[midway2-0015:35095] Signal: Segmentation fault (11)
[midway2-0015:35095] Signal code: Invalid permissions (2)
[midway2-0015:35095] Failing at address: 0x7fd7633c6000
[midway2-0015:35095] [ 0] /lib64/libpthread.so.0(+0xf100)[0x7fdb86986100]
[midway2-0015:35095] [ 1] /home/jumper/upside/py/../obj/libupside.so(_ZN13BackbonePairs13compute_valueE11ComputeMode+0x5e1)[0x7fdb7328c571]
[midway2-0015:35095] [ 2] /home/jumper/upside/py/../obj/libupside.so(_ZN11DerivEngine7computeE11ComputeMode+0x4c9)[0x7fdb73277a59]
[midway2-0015:35095] [ 3] /home/jumper/upside/py/../obj/libupside.so(evaluate_energy+0x65)[0x7fdb73202ba5]
[midway2-0015:35095] [ 4] /software/python_ucs4-2.7.13-el7-x86_64+gcc-6.2/lib/python2.7/lib-dynload/_ctypes.so(ffi_call_unix64+0x4c)[0x7fdb5280e15a]
[midway2-0015:35095] [ 5] /software/python_ucs4-2.7.13-el7-x86_64+gcc-6.2/lib/python2.7/lib-dynload/_ctypes.so(ffi_call+0x153)[0x7fdb5280cd33]
[midway2-0015:35095] [ 6] /software/python_ucs4-2.7.13-el7-x86_64+gcc-6.2/lib/python2.7/lib-dynload/_ctypes.so(_ctypes_callproc+0x277)[0x7fdb528042b7]
[midway2-0015:35095] [ 7] /software/python_ucs4-2.7.13-el7-x86_64+gcc-6.2/lib/python2.7/lib-dynload/_ctypes.so(+0x9b52)[0x7fdb527fab52]
[midway2-0015:35095] [ 8] /software/python_ucs4-2.7.13-el7-x86_64+gcc-6.2/lib/libpython2.7.so.1.0(PyObject_Call+0x43)[0x7fdb86be79a3]
[midway2-0015:35095] [ 9] /software/python_ucs4-2.7.13-el7-x86_64+gcc-6.2/lib/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x55ed)[0x7fdb86c9df7d]

【问题讨论】:

【参考方案1】:

当你将库加载到 gdb 中时,命令

disas /m

应该显示与源代码行交错的偏移量的反汇编(如果此信息可用)。 cf: gdb machine code。

如果您调用一些由编译器内联的 MPI 代码(例如互斥锁/解锁),堆栈跟踪中的 Pthread 可能会出现。

【讨论】:

感谢您的信息。万一其他人偶然发现了这一点,disas /m 已被弃用,取而代之的是 disas /s,这在存在大量内联的情况下效果更好。

以上是关于从堆栈跟踪中查找共享库中的源代码行的主要内容,如果未能解决你的问题,请参考以下文章

共享库符号查找模板实例化

如何在共享库中的确切行号上设置断点?

Windows下的异常处理和堆栈跟踪(MinGW/gcc)

为啥我的异常堆栈跟踪总是指向最后一个方法行?

C++:动态共享库中的虚函数产生段错误

如何在共享库中找到 C++ isfinite() 的解析位置?