游戏渲染器线程回溯在linux上没有符号

时间:2016-01-20 18:02:15

标签: linux debugging gdb

我有一个在linux上运行的游戏应用程序。我们是一家游戏公司。我有这种随机崩溃,就像24-48小时一样。它最后一次发生我试图看到它崩溃的线程的回溯,但gdb显示堆栈已损坏,没有符号。 现在,当我运行游戏并中断gdb时,有时我能够看到此线程的函数调用堆栈,但大多数时候我看不到任何符号。线程是渲染器线程。 我们使用的一些游戏库是专有的第三方,没有调试符号。所以我想知道渲染器线程调用堆栈是否深入(库中的各种调用)到没有符号的这些库中,所以我不会看到调用堆栈?如果这是真的,我该如何解决这个问题? 如果没有,任何想法可能是什么原因。

1 个答案:

答案 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