2011-09-09 10 views
6

का उपयोग करके 'स्थानीय चर' डिस्प्ले कैसे बनाएं I DWScript के लिए एक आईडीई लिख रहा हूं और इसे डीबगर का उपयोग करके कोड के माध्यम से कदम उठाना है। अब मैं 'स्थानीय चर' का प्रदर्शन जोड़ना चाहता हूं (यानी उन क्षेत्रों में)। क्या कोई मुझे ऐसा करने के साधनों के लिए एक सूचक दे ​​सकता है? मैं सभी प्रतीकों की एक सूची प्राप्त कर सकता हूं लेकिन समझ में नहीं आता कि चीजों का वर्तमान दायरा हिस्सा कैसे प्राप्त करें। धन्यवाद।डीडब्लूस्क्रिप्ट और इसके डीबगर

उत्तर

9

कास्ट IdwsProgramExecutionको TdwsProgramExecution, आप एक "CurrentProg" के लिए उपयोग संपत्ति प्राप्त करेंगे, एक TdwsProgram जो या तो एक TdwsMainProgram है (यदि आप मुख्य में हैं) या TdwsProcedure (यदि आप एक proc/func/विधि में हैं)। उनके पास तालिका संपत्ति होगी, जो स्थानीय प्रतीकों को सूचीबद्ध करती है, जो कि सबसे प्रत्यक्ष दायरा है। तालिका में एक या अधिक माता-पिता होगा, जो मूल स्कॉप्स को संदर्भित करता है (पदानुक्रमित रूप से, स्रोत कोड स्कोप के संदर्भ में)।

एक TdwsProcedure में, आप भी अपनी FuncSymbol संपत्ति को देखने के लिए है, जो मानकों का एक मेज होगा (उपयोगी अगर आप सीधे स्थानीय गुंजाइश के बाकी हिस्सों से मानकों को अलग करना चाहते हैं) चाहते हो सकता है, तो

+0

धन्यवाद एरिक, पहली बार काम किया। –

2

इस प्रश्न को पढ़ने वाले किसी भी अन्य व्यक्ति के लिए, मैं प्रतीक के मूल्य प्राप्त करने से संबंधित कुछ पूरक जानकारी दिखाऊंगा। प्रतीक उपरोक्त एरिक द्वारा वर्णित के रूप में पाया गया है लेकिन प्रतीक के वास्तविक मूल्य को कैसे प्राप्त करना है, यह काम करना मुश्किल है। नीचे दिया गया कोड एक ऐसी प्रक्रिया है जो स्थानीय चर के साथ एक टीएममो (memLocalVariables) को हर बार बुलाती है। वैरिएबल वैल्यू के स्वच्छ स्वरूपण और कॉलिंग पैरामीटर तक पहुंच जैसी कुछ विशेषताएं गायब हैं। मैं इसे डीबगर 'dsDebugSuspended' स्थिति से कॉल करता हूं। कम अंतर्ज्ञानी बिट स्टैक पर प्रतीक डेटा तक पहुंच और स्टैक बेस पॉइंटर का उपयोग है। संकलक कैसे काम करता है सीखने का एक शानदार तरीका! लेकिन, शायद वहां एक उपयोगिता समारोह है जो मुझे नहीं मिला है ...? एरिक?

procedure DrawLocalVariables; 
    var 
    ProgramExecution : TdwsProgramExecution; 
    I : integer; 
    Sym : TSymbol; 
    V : variant; 
    Adr : integer; 
    SymbolTable : TSymbolTable; 
    begin 
    memLocalVariables.Lines.Clear; 

    ProgramExecution := TdwsProgramExecution(dwsDebugger1.Execution); 
    SymbolTable := ProgramExecution.CurrentProg.Table; 
    For I := 0 to SymbolTable.Count-1 do 
     begin 
     Sym := SymbolTable[I]; 
     if Sym is TDataSymbol then 
     begin 
     Adr := TDataSymbol(Sym).StackAddr + ProgramExecution.Stack.BasePointer; 
     ProgramExecution.Stack.ReadValue(Adr, V); 
     memLocalVariables.Lines.Add(Format('%s = %s', [ Sym.Name, VarToStr(V) ])); 
     end; 
     end; 
    end; 
+1

आप TdwsCompiler का उपयोग कर सकते हैं। स्थानीय चर का उपयोग कर चर या अभिव्यक्ति का मूल्यांकन करने के लिए मूल्यांकन करें (डीबगर का वॉचर इसका उपयोग करें)। प्रत्यक्ष स्टैक एक्सेस सबसे प्रभावी तरीका है, हालांकि, यदि आप केवल चर के मान चाहते हैं, लेकिन मूल्यांकन एक वर्ग चर के क्लासनाम को अधिक आसानी से प्राप्त करने की अनुमति देता है f.i. –

+0

अच्छा बिंदु एरिक, धन्यवाद, मैं इसके बारे में सोचा नहीं था –