我有一个在linux上运行的游戏应用程序。我们是一家游戏公司。我有这种随机崩溃,就像24-48小时一样。它最后一次发生我试图看到它崩溃的线程的回溯,但gdb显示堆栈已损坏,没有符号。 现在,当我运行游戏并中断gdb时,有时我能够看到此线程的函数调用堆栈,但大多数时候我看不到任何符号。线程是渲染器线程。 我们使用的一些游戏库是专有的第三方,没有调试符号。所以我想知道渲染器线程调用堆栈是否深入(库中的各种调用)到没有符号的这些库中,所以我不会看到调用堆栈?如果这是真的,我该如何解决这个问题? 如果没有,任何想法可能是什么原因。
答案 0 :(得分:1)
(gdb) bt #0 0x9f488882 in ?? ()
另外,在bt中我做了一个info proc映射和上面的地址,我发现了以下内容:
0x9f488000 0x9f48a000 0x2000 0x0 /tmp/glyFI8DP (deleted)
这意味着您的第三方库正在使用即时编译来生成一些代码,将其映射到您的流程中并删除它。
在x86_64上,GDB需要展开描述符来展开堆栈,但它无法从已删除的文件中获取它们,因此您不会获得堆栈跟踪。
您有几个选择:
使用GDB dump
命令转储区域的内容:
(gdb) dump /tmp/gly.so 0x9f488000 0x9f48a000
如果幸运的话,生成的二进制文件实际上是一个ELF(它不必是),并且可能包含符号和展开描述符。使用readelf --all /tmp/gly.so
查看内部。
如果是ELF文件,您可以让GDB知道那些在0x9f488000
映射的内容。您需要找到其中$tstart
部分的地址(下面.text
)(应该在readelf
输出中),然后:
(gdb) add-symbol-file /tmp/gly.so 0x9f488000+$tstart