2011-12-08 29 views
3

我使用回溯到打印應用程序的堆棧跟蹤和我越來越像如何「解密」鏈接器方法名稱?

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++中「去除」鏈接器符號。

+0

C++ FILT是你的朋友 – fjardon

+0

@fjardon,我可以從源代碼使用這種方法嗎?有沒有什麼 char * s = cpp_filt(MyStackString); – Arenim

+0

@fjardon,C++ filt只能使用gcc名稱,而MSVS或任何其他編譯器可能使用不同的規則。 –

回答

4
  • 在gcc下,你可以使用c++filt來破譯mangling。

  • 在Visual Studio中,您可以undname

一旦你的函數名,你至少在Windows中可以使用DIA SDK獲取源文件的行號等

2

這叫做name mangling。請閱讀維基百科上的文章,因爲在這裏引用它對於答案來說太多了。