【问题标题】:How to "decrypt" linker method names?如何“解密”链接器方法名称?
【发布时间】:2011-12-08 16:05:42
【问题描述】:

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

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

【问题讨论】:

  • @fjardon ,我可以从源代码中使用这个方法吗?有没有 char * s = cpp_filt(MyStackString);
  • @fjardon,c++filt 仅适用于 gcc 名称,而 MSVS 或任何其他编译器可能使用不同的规则。
  • @Arenim,c++filt 是 Linux 的命令行工具。它不是一个函数。
  • 是的,我明白了。它对我有用,但我敢肯定,它使用了一些库,能够在应用程序中使用,对吧?
  • @Arenim:如果您非常需要它,我会查看源代码:)。

标签: c++ debugging backtrace


【解决方案1】:
  • 在 gcc 下,您可以使用 c++filt 来破译重整。

  • 在 Visual Studio 下你可以undname

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

【讨论】:

    【解决方案2】:

    这称为name mangling。请阅读 Wikipedia 上的文章,因为在这里引用它可能无法回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多