6

我正在使用回溯来打印应用程序的堆栈跟踪,我得到了类似的东西

libQtCore.so.4(_ZN11QMetaObject8activateEP7QObjectPKS_iPPv+0x843) [0x7f889d20cf33]
libQtGui.so.4(_ZN7QAction9triggeredEb+0x32) [0x7f889d76c2f2]
libQtGui.so.4(_ZN7QAction8activateENS_11ActionEventE+0xb0) [0x7f889d76d670]
libQtGui.so.4(+0x6242f4) [0x7f889db862f4]

有没有办法将“链接器名称”转换为“源名称”并从偏移量中获取代码行号?

我想要回溯,看起来像这样:

libQtCore.so.4 (QMetaObject::activate(QObject):1022)
libQtGui.so.4  (QAction::triggered()::47) 

UPD。

我知道,由于编译器的具体情况,这种技术可能有效,也可能无效或效果不佳。我想至少在 gcc 和 Visual c++ 中“解包”链接器符号。

4

2 回答 2

6
  • 在 gcc 下,您可以使用c++filt来破译修饰。

  • 在 Visual Studio 下,您可以取消命名

一旦您至少在 Windows 上获得了函数名称,您就可以使用DIA SDK来获取源文件行号等

于 2011-12-08T16:30:16.127 回答
2

这称为名称修饰。请阅读 Wikipedia 上的文章,因为在这里引用它对于答案来说太过分了。

于 2011-12-08T16:12:25.130 回答