【发布时间】: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:如果您非常需要它,我会查看源代码:)。