如何"decrypt"链接器方法名称?

How to "decrypt" linker method names?

本文关键字:方法 decrypt 链接 如何      更新时间:2023-10-16

我正在使用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) 

乌利希期刊指南。

我明白,由于编译器的具体情况,这种技术可能工作或不工作或工作不好。我想至少在gcc和visual c++中"demangle"链接器符号

  • 在gcc下,你可以使用c++filt来解密混乱

  • 在Visual studio下你可以undname

一旦你有了函数名你至少在Windows上你可以使用DIA SDK来获取源文件行号等

这叫做名称混淆。请阅读维基百科上的文章,因为在这里引用它对于答案来说太过了。