2016-08-30 84 views
1

我正在尋找一些memoryleaks,並且我在FullDebugMode中使用FastMM來獲取事件日誌。這工作相當好,但堆棧跟蹤...不是很好。Delphi - FastMM事件日誌方法名稱

簡單例子:

This block was allocated by thread 0x25F8, and the stack trace (return addresses) at the time was: 
4081E8 [FastMM4.pas][FastMM4][_ZN7Fastmm411DebugGetMemEx][8737] 
4086A5 [FastMM4.pas][FastMM4][_ZN7Fastmm413DebugAllocMemEx][9019] 
F0D820 [_ZN6System8AllocMemEx] 
F18A0D [_ZN6System8TMonitor6CreateEv] 
F18EEB [_ZN6System8TMonitor10GetMonitorEPNS_7TObjectE] 
10AE265 [_ZN6System7Classes16CheckSynchronizeEi] 
54CAC7 [Vcl.Forms.pas][Vcl.Forms][_ZN3Vcl5Forms12TApplication4IdleERK6tagMSG][11044] 
54B598 [Vcl.Forms.pas][Vcl.Forms][_ZN3Vcl5Forms12TApplication13HandleMessageEv][10473] 
54BA24 [Vcl.Forms.pas][Vcl.Forms][_ZN3Vcl5Forms12TApplication3RunEv][10611] 
566719 [ServerRunner.pas][ServerRunner][_ZN12Serverrunner9RunServerEv][113] 

這不是對我來說很容易讀取。我喜歡這個單元名稱是方形的,但方法名稱會發生​​什麼?我知道有它的參數類型的方法的完全限定名稱。但是什麼混亂(像_ZN3,5,12,3,Ev)注入它?

+0

您使用的是運行時軟件包嗎?什麼堆棧跟蹤庫正在使用? –

+0

請參閱https://en.wikipedia.org/wiki/Name_mangling - 此問題與Spring4D有何關係? –

+0

@StefanGlienke:謝謝。這與Spring4D並沒有緊密聯繫。我決定將這個問題標記爲S4D(對不起?),因爲它在項目中使用了堆棧跟蹤,第二個原因是S4D社區對我更可靠(尤其是您作爲主人:))。 –

回答

2

_ZN3,5,12,如圖3所示,EV
這被稱爲name mangling

因爲可以用相同名稱重載2個函數(如果使用不同的參數),編譯器需要一些方法來區分它們。
這樣做的方式是通過以供應商特定方式對參數進行編碼並將這些代碼添加到方法名稱中。

查看所以這個問題:Delphi - unmangle names in BPL's

德爾福提供了一個名爲tdump.exe and tdump64.exe工具,可以爲你解碼重整的名稱。
有人甚至爲它寫了一個ruby gem

tdump -e <name_of_exe> 

將做的伎倆,並顯示所有未加密的名稱。

這裏的一些閱讀:http://www.int0x80.gr/papers/name_mangling.pdf

如果你願意投資,那麼MadExcept unmangles名稱爲您服務。

+0

謝謝你的迴應!但是,tdup以及SO上的(舊)解決方案對我來說都不起作用。然而它指出了我正確的方式。 name_mangling紙很棒。 –