如何“解密”链接器方法名称?

时间:2011-12-08 16:05:43

标签: c++ debugging backtrace

我正在使用backtrace来打印应用程序的堆栈跟踪,而我正在使用

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 ++中“解码”链接符号。

2 个答案:

答案 0 :(得分:6)

  • 在gcc下,您可以使用c++filt来破译重整版。

  • 在Visual studio下,您可以undname

至少在Windows上拥有功能名称后,您可以使用 DIA SDK 来获取源文件行号等

答案 1 :(得分:2)

这称为name mangling。请阅读维基百科上的文章,因为在这里引用它对于答案来说太过分了。