2009-08-19 18 views
23

क्या वर्तमान में इस विधि का नाम जानने का कोई तरीका है?डेल्फी 7 में वर्तमान विधि का नाम कैसे प्राप्त करें?

ताकि:

procedure TMyObject.SomeMethod(); 
begin 
    Writeln('my name is: ' + <hocus pocus>); 
end; 

इस उत्पादन का उत्पादन होगा:

my name is: SomeMethod

उत्तर

27

JCL नि: शुल्क है और उस के लिए कार्य करती है। यह इस बात पर निर्भर करता है कि एक स्टैक ट्रेस कितनी अच्छी तरह से बनाया जा सकता है और कितनी डीबग जानकारी मौजूद है।

JclDebug.pas

function FileByLevel(const Level: Integer = 0): string; 
function ModuleByLevel(const Level: Integer = 0): string; 
function ProcByLevel(const Level: Integer = 0): string; 
function LineByLevel(const Level: Integer = 0): Integer; 
+14

मैं इसे जोड़ दूंगा बस किसी प्रकार की डीबग जानकारी के बिना नहीं किया जा सकता है। –

6

भी 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; 

यह विधि कॉलर के पते को पुनर्प्राप्त करने में सक्षम है, और इसके यूनिट का नाम, विधि नाम और लाइन नंबर लॉग करें।

+0

क्या आप इसे जोड़ने के बिना सामान्य डीबग बिल्ड (या बाहरी मानचित्र के साथ रिलीज़) से कॉल स्टैक लॉगिंग के लिए इसका उपयोग कर सकते हैं, उदाहरण के लिए, जेडी डीबग कोड? कुछ विशिष्ट परिस्थितियों में यह कोड होना बहुत उपयोगी हो सकता है जो लॉग कर सकता है और रिपोर्ट कर सकता है कि इसे कहां से बुलाया गया था। –

+0

@ डेविड एम हाँ, आप यह कर सकते हैं। यदि कोई .map/.mab संलग्न नहीं है, तो यह हेक्साडेसिमल पते लॉग करेगा। फिर हमारे LogView टूल .exe से मेल खाने वाली मौजूदा .map फ़ाइल से स्रोत कोड लाइन पुनर्प्राप्त करने में सक्षम है। लेकिन निश्चित रूप से, चूंकि हमारा। एमएबी प्रारूप बहुत छोटा है, इसलिए मुझे संकलन समय पर .exe में एम्बेड न करने का कोई कारण नहीं दिखता है। –

+0

@ArnaudBouchez क्या आप इसे संकलित समय पर .exe में एम्बेड करने के तरीके को बता सकते हैं? – SOUser

संबंधित मुद्दे