【发布时间】:2016-07-20 19:16:16
【问题描述】:
如何从共享库中获取函数名称和崩溃原因。 我可以完全访问共享库;我可以用不同的标志重新编译它,甚至是主要源代码。请告诉我该怎么做?
目前我在信号处理程序中实现了回溯功能,但它提供的是主函数的跟踪,而不是共享库的跟踪。
【问题讨论】:
-
查找“核心转储”和“gdb”。
-
...不要忘记使用调试符号进行编译,否则您的跟踪将只包含内存地址。
如何从共享库中获取函数名称和崩溃原因。 我可以完全访问共享库;我可以用不同的标志重新编译它,甚至是主要源代码。请告诉我该怎么做?
目前我在信号处理程序中实现了回溯功能,但它提供的是主函数的跟踪,而不是共享库的跟踪。
【问题讨论】:
假设您使用的是 glibc,您可以 LD_PRELOAD 包含的 libSegFault 库来捕获信号并打印堆栈跟踪。
$ LD_PRELOAD=/lib/libSegFault.so ./a.out
【讨论】:
当你重新编译库时,使用 -g 标志。通常这是通过 Makefile 中的 CFLAGS 或 CPPFLAGS 之类的东西来完成的。此外,在二进制文件上运行 gdb 之前,您应该设置 LD_LIBRARY_PATH 以包含共享库的调试版本的路径(如果 LD_LIBRARY_PATH 中存在其他项目,请确保您的条目位于最前面)。最后可以将源码复制到工作目录中,这样就可以找到源码并设置断点了。
【讨论】: