【问题标题】:game renderer thread backtrace with no symbols on linuxlinux上没有符号的游戏渲染器线程回溯
【发布时间】:2016-01-22 02:15:22
【问题描述】:

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

【问题讨论】:

  • 如果没有更多详细信息,就不可能提供有用的答案:您在哪个 CPU 上运行?什么版本的 GDB? btinfo proc maps实际 输出是什么?等等。
  • GNU gdb (GDB) 7.6 , Intel(R) Core(TM) i3-4100E CPU @ 2.40GHz (gdb) bt #0 0x9ea8a702 in ?? () 无法访问地址 0x3f340004 处的内存
  • 早上游戏刚崩溃。我做了一个 bt 并得到了 (gdb) bt #0 0x9f488882 in ?? () 另外,做了一个 info proc mappings 和上面的地址 bt 我发现了以下内容:0x9f488000 0x9f48a000 0x2000 0x0 /tmp/glyFI8DP (deleted)

标签: linux debugging gdb


【解决方案1】:
(gdb) bt
#0 0x9f488882 in ?? ()

另外,做了一个 info proc 映射,对于上面在 bt 中的地址,我发现了以下内容:

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 映射的内容。您需要在其中找到.text 部分的地址(下面的$tstart)(应该在readelf 输出中),然后:

    (gdb) add-symbol-file /tmp/gly.so 0x9f488000+$tstart

【讨论】:

  • 我转储了内存。但它不是一个精灵文件。我使用了以下命令。 dump memory /tmp/gly.so 0x9f488000 0x9f48a000readelf -all /tmp/gly.soreadelf: Error: Not an ELF file - it has the wrong magic bytes at the start
  • 你能告诉我你是如何得出它是及时编译的吗?我想学。
猜你喜欢
  • 1970-01-01
  • 2021-09-21
  • 2015-03-15
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多