2012-03-01 17 views
13

मैं एक बार फिर एक बाहरी डीबगर विजुअलाइज़र लिख रहा हूं, और एक दीवार में दौड़ रहा हूं। ऐसा लगता है कि डीबगर विज़ुअलाइज़र वापस लौटने वाले स्ट्रिंग के आकार की सीमा हो सकती है।मैं उस स्ट्रिंग के आकार को कैसे बढ़ा सकता हूं जो बाहरी डीबगर विज़ुअलाइज़र प्रदर्शित कर सकता है?

डेल्फी 2010 के साथ भेजे गए टीएसट्रिंग डीबगर विज़ुअलाइज़र की 4K की सीमा थी। Embarcadero के न्यूज़ ग्रुप, ईवे शस्टर replied पर पोस्ट किए गए एक प्रश्न के जवाब में, "आप बफर को थोड़ा बढ़ा सकते हैं, लेकिन AFAIR वास्तविक सीमा IOTAThread में है। लगभग 12k वर्णों की सीमा के साथ मूल्यांकन करें।"

मेरा डीबगर विज़ुअलाइज़र टीएसट्रिंग्स डीबगर विज़ुअलाइज़र के कोड पर आधारित है, और मैं देख सकता हूं कि TFrame की मूल्यांकन विधि के कार्यान्वयन में ResultStr की निम्न घोषणा शामिल है, जिसका उपयोग IOTAThread से लौटाई गई स्ट्रिंग को वापस करने के लिए किया जाता है। फोन:

ResultStr: array[0..4095] of Char; 

मैं आशा व्यक्त की थी कि इस बफर के आकार में वृद्धि करने में मदद मिलेगी, लेकिन कोई किस्मत।

मेरे बाहरी डीबगर विज़ुअलाइज़र प्रदर्शित करने वाले स्ट्रिंग के आकार को बढ़ाने के लिए, यदि कुछ भी हो, तो मैं क्या कर सकता हूं?

+2

एक कामकाज के रूप में, क्या आप PString के लिए एक विज़ुअलाइज़र बना सकते हैं? – gabr

उत्तर

11

मेरे पास उस सीमा के लिए एक ही सीमित धैर्य था ... इसलिए मैंने एक डीबग विज़ुअलाइज़र बनाया जो अभिव्यक्ति के स्ट्रिंग परिणाम को पकड़ने के लिए डीबग प्रक्रिया में मेमोरीस्ट्रीम बनाकर सीमा के चारों ओर काम करता है, फिर कुछ ऐसा उपयोग करें

CurProcess.ReadProcessMemory(StrToInt(SrcMemoryAddr), DstMemStream.Size, DstMemStream.Memory^); 

इसे विज़ुअलाइज़र मेमोरीस्ट्रीम में कॉपी करने के लिए। फिर आप जो कुछ भी प्रदर्शित करना चाहते हैं वह कर सकते हैं (उदाहरण के लिए इसे मानव पढ़ने के लिए स्वरूपित करना अगर यह क्लाइंटडेटासेट.एक्सएमएलटाटा जैसे एक्सएमएल स्ट्रिंग है)।

वहाँ निर्भर करता है अगर अभिव्यक्ति एक स्थिरांक स्ट्रिंग, एक वर, है या मूल्यांकन आदि की जरूरत है कुछ गुर रहे हैं ...

मेरे FGStringVisualizer जिसके कारण मैं इसे अभी तक पर प्रकाशित नहीं किया है, 100% संतोषजनक नहीं है मेरा ब्लॉग, लेकिन जैसा कि मुझे 99% की जरूरत है, मैंने इसे थोड़ा सा साफ करने और इसे "जैसा है" प्रकाशित करने में समय नहीं लगाया। लेकिन अगर कोई ज़रूरत है तो मैं निश्चित रूप से सभी आवश्यक अस्वीकरण के साथ ऐसा कर सकता हूं ...

अद्यतन: यह वही विचार है जिसे मैंने अपने FGStringListVisualizer के लिए उपयोग किया था जिसे मैंने अंतिम डेल्फी लाइव में प्रस्तुत किया था। वैसे, यह भी मेरे ब्लॉग पर डालने लायक हो सकता है क्योंकि मैंने कुछ सुधार किए हैं।

+1

शानदार। आपका बहुत बहुत धन्यवाद। हालांकि, मैं जवाब पूरी तरह समझ नहीं पा रहा हूं। मैं CurrentThread प्राप्त करने के लिए CurProcess का उपयोग करता हूं, और उसके बाद अभिव्यक्ति के मान (जो मेरे मामले में एक स्ट्रिंग है) प्राप्त करने के लिए CurrentThread पर मूल्यांकन करें। आपके द्वारा प्रदान किया गया कोड इस समीकरण में कैसे काम करता है। क्या आपका ScrMemoryAddr मूल्यांकन का परिणाम परिणाम Addr पैरामीटर है। और DstMemStream आपके विज़ुअलाइज़र के TMemoryStream? –

+0

मैं CurProcess में मेमोरीस्ट्रीम बनाने के लिए 'मूल्यांकन' कहता हूं: 'अगर मूल्यांकन नहीं किया जाता है (डीबगएसवीसीएस, क्यूरप्रोसेस, कर्ट थ्रेड,' नेटिवइन्ट (टीएममोरीस्ट्रीम.क्रेट) ', एसआरसीएममस्ट्रीम एडडर) तो। फिर मैं स्ट्रिंग को उसमें रखने के लिए फिर से 'मूल्यांकन करें' का उपयोग करता हूं: 'यदि मूल्यांकन नहीं किया जाता है (डीबगएसवीसीएस, क्यूरोक्रैस, कर्ट थ्रेड, ' टीएममोरीस्ट्रीम ('+ एसआरसीएममस्ट्रीम एडडर +') .इट्राइट (('+ एफईएक्सप्रेस + '), लंबाई (' + FExpression + ') * SizeOf (Char))', CurSizeResult) तो '... जहां यह अभिव्यक्ति की प्रकृति के आधार पर अस्पष्ट हो जाता है ... –

+1

कृपया मेरी अज्ञानता से क्षमा करें, लेकिन मुझे एक मूल्यांकन विधि नहीं मिल रही है जो एक IOTADebuggerServices, IOTAProcess, और IOTAThread इसके पहले तीन पैरामीटर के रूप में। क्या यह एक कस्टम विधि है जिसे आपने लिखा था। यदि नहीं, तो मुझे किस इंटरफ़ेस पर मूल्यांकन का यह संस्करण मिलेगा? –