2016-08-30 6 views
1

Я охочусь за памятью, и я использую FastMM в FullDebugMode для получения журналов событий. Это работает очень хорошо, но stacktrace ... не очень приятен вообще.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 (извините?), Потому что он используется в проекте, из которого была взята stacktrace, а вторая причина - сообщество S4D для меня более надежным (и особенно вам как хозяину :)). –

ответ

2

_ZN3, 5, 12, 3, Ер
Это называется name mangling.

Поскольку возможно перегрузить 2 функции с одинаковыми именами (при использовании разных параметров), компилятор должен каким-то образом рассказать им обособленно.
Как это сделать, путем кодирования параметров конкретным способом поставщика и добавления этих кодов к имени метода.

Смотрите этот вопрос на SO: Delphi - unmangle names in BPL's

Delphi поставляется с утилитой под названием 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 превосходна. –