भी our TSynMapFile
class देखें।
यह .map
फ़ाइल लोड करने में सक्षम है, और इसे एक अनुकूलित बाइनरी प्रारूप में संपीड़ित करने में सक्षम है। यह .map
से बहुत छोटा होगा (उदा। 900 केबी .map
-> 70 केबी .mab
)। यह .mab
आसानी से exe के भीतर एम्बेडेड किया जा सकता है। यह जेसीएल या मैडएक्ससेप्ट द्वारा उपयोग किए जाने वाले प्रारूप से छोटा है, और डेल्फी द्वारा संकलित समय पर एम्बेडेड जानकारी से भी छोटा है। यहाँ
Map := TSynMapFile.Create; // or specify an exe name
try
i := Map.FindSymbol(SymbolAddr);
if i>=0 then
writeln(Map.Symbols[i].Name);
// or for your point:
writeln(Map.FindLocation(Addr)); // e.g. 'SynSelfTests.TestPeopleProc (784)'
finally
Map.Free;
end;
उदाहरण के लिए, यह कैसे हमारे प्रवेश वर्गों से इस्तेमाल किया जाता है:
आप इस तरह के रूप में इसका इस्तेमाल करेंगे।
procedure TSynLog.Log(Level: TSynLogInfo);
var aCaller: PtrUInt;
begin
if (self<>nil) and (Level in fFamily.fLevel) then begin
LogHeaderLock(Level);
asm
mov eax,[ebp+4] // retrieve caller EIP from push ebp; mov ebp,esp
sub eax,5 // ignore call TSynLog.Enter op codes
mov aCaller,eax
end;
TSynMapFile.Log(fWriter,aCaller); // here it will call TSynMapFile for the current exe
LogTrailerUnLock(Level);
end;
end;
यह विधि कॉलर के पते को पुनर्प्राप्त करने में सक्षम है, और इसके यूनिट का नाम, विधि नाम और लाइन नंबर लॉग करें।
स्रोत
2012-05-30 17:25:43
मैं इसे जोड़ दूंगा बस किसी प्रकार की डीबग जानकारी के बिना नहीं किया जा सकता है। –