6

तो मैं एक विशिष्ट एपीआई या विंडोज संदेश में ब्रेकपॉइंट रखना चाहता हूं। मुझे किसी भी डेल्फी संस्करण में कोड लिखने के बिना ऐसा करने का कोई आसान तरीका नहीं मिला है। क्या ऐसा करने का कोई तरीका है जैसा कि मैं स्मृति पहुंच में ब्रेकपॉइंट डाल सकता हूं?किसी विशिष्ट विंडोज संदेश या एपीआई पर रुकने के लिए डीबगिंग करते समय, कोई त्वरित तरीका है?

उत्तर

12

एक API कार्य करने के लिए किसी भी कॉल पर रोक, की implementation अनुभाग Windows.pas (या जहाँ भी ब्याज के समारोह घोषित किया जाता है) में मिल और एक ब्रेकपाइंट सेट करने के लिए। यह उन कार्यों का ख्याल रखता है जिनका उपयोग आप लोड-टाइम गतिशील लिंकिंग के साथ करते हैं। रन-टाइम डायनामिक लिंकिंग (LoadLibrary और GetProcAddress) के लिए, आपको एक अलग तकनीक की आवश्यकता होगी। GetProcAddress का परिणाम प्राप्त करने वाला वेरिएबल उस पते को पकड़ लेगा जिसे आप तोड़ना चाहते हैं, लेकिन मुझे पता नहीं है कि उस पते पर ब्रेकपॉइंट कैसे सेट करें।

विंडो संदेश पर रोकना मुश्किल है क्योंकि संदेशों को कई स्थानों पर पुनर्प्राप्त किया जा सकता है। आपको इसके बजाय सशर्त ब्रेकपॉइंट्स का उपयोग करना होगा।

अधिकतर पोस्ट किए गए संदेशों को पकड़ने के लिए, आप PeekMessage पर कॉल के बाद पहली पंक्ति पर TApplication.HandleMessage में ब्रेकपॉइंट डाल सकते हैं। स्थिति को Msg.Message = x पर सेट करें। HandleMessage मुख्य Application.Run संदेश लूप के साथ-साथ वीसीएल के मोडल संदेश लूप के लिए मुख्य थ्रेड के संदेश कतार में पोस्ट किए गए संदेशों का ख्याल रखता है। अन्य मोडल संवाद (जैसे कि Windows.MessageBox) इसका उपयोग नहीं करेंगे, हालांकि।

देखकर संदेश भेजे गए हैं क्योंकि ओएस उन्हें सीधे अपनी लक्षित विंडो प्रक्रियाओं में भेजता है। आपको अपनी रुचि रखने वाली प्रत्येक विंडो कक्षा की विंडो प्रक्रिया में ब्रेकपॉइंट सेट करना होगा। आप Classes.StdWndProc में अपना सशर्त ब्रेकपॉइंट डाल कर अधिकतर वीसीएल विंडो कक्षाएं प्राप्त कर सकते हैं।

ध्यान रखें कि सशर्त ब्रेकपॉइंट बहुत धीमी हो सकती है। वे डीबगर द्वारा बिना शर्त ब्रेकपॉइंट डालकर काम करते हैं, और जब ओएस इसे ट्रिगर करता है, तो डीबगर खत्म हो जाता है, स्थिति की जांच करता है, और फिर सशर्त विफल होने पर निष्पादन फिर से शुरू होता है। इसमें डीबगर और आपके आवेदन के बीच स्विचिंग, बहुत अधिक ओवरहेड शामिल हो सकता है; कार्यक्रम संदेशों के संदेश प्राप्त करते हैं, इसलिए यदि आप डीबगर को प्रत्येक की जांच करने के लिए अपने प्रोग्राम को बाधित करने से बचने का तरीका ढूंढ सकते हैं, तो इसे करें।

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

+4

आप किसी विशेष पते पर ब्रेक पॉइंट जोड़ सकते हैं ... ब्रेकपॉइंट्स विंडो पर जाएं, जब आपने एप्लिकेशन को ब्रेक पॉइंट पर तोड़ दिया है (जैसे 'GetProcAddress' पर कॉल पर), प्रक्रिया के पते को कैप्चर करें किसी भी तरह, ब्रेकपॉइंट्स विंडो खोलें, राइट क्लिक करें और एड> एड्रेस ब्रेकपॉइंट चुनें। फिर आप पते में डाल दिया। जब यह पता चलता है तो डीबगर को तोड़ना चाहिए। नोट: पता स्पष्ट रूप से केवल आपके निष्पादन योग्य के आमंत्रण के लिए मान्य है। – Nat

+0

+1। यह सवाल एक नए सहयोगी द्वारा प्रेरित किया गया था जो एक नया डेल्फी उपयोगकर्ता है। उन्होंने इस तथ्य को याद किया कि विजुअल बेसिक में वह एक प्रकार का "ट्रैक अगली उपयोगकर्ता आंदोलन" कर सकता था (जबकि डीबगिंग, उपयोगकर्ता क्लिक पर डीबगर स्टॉप, एंटर आदि ... लेकिन एप्लिकेशन "निष्क्रिय" होने पर नहीं)। कॉलस्टैक का उपयोग करके, मुझे इसकी आवश्यकता महसूस नहीं होती है। लेकिन एहसास हुआ कि मैं कुछ अजीब बग को हल करने के लिए विंडोजएपीआई और संदेशों में बीपी का उपयोग कर सकता हूं।जैसा कि मुझे याद आया कि एक और उन्नत डीबगर में, मैं कंसोल विंडो में बस 'बीपीएक्स WM_GETTEXTA' कर सकता था, मुझे आश्चर्य हुआ कि क्या डेल्फी का एक आसान तरीका भी था। – EMBarbosa

+0

@Nat hmmm ... शायद मैं उस कार्य को स्वचालित करने के लिए कुछ नए डेल्फी डीबगर के एपीआई का उपयोग कर सकता हूं ... लेकिन मैं इससे इतना परिचित नहीं हूं ... क्या यह एक अच्छा सवाल होगा? – EMBarbosa

1

आपको विकल्प में जाना होगा। लिंकर और "डीबग डीसीयू" जांचें। डिफ़ॉल्ट रूप से यह चेक नहीं किया जाता है, इसलिए जब आप काम करने की कोशिश कर रहे हों तो डीबगर पूरे वीसीएल के माध्यम से कदम नहीं उठाता है।

+0

इसके अलावा यह एक वैध और महत्वपूर्ण टिप्पणी है। मैं वीसीएल डीबग करने का कोई तरीका नहीं पूछ रहा हूं। आप कम प्रतिष्ठा के साथ टिप्पणी नहीं कर सकते ... यह अच्छा नहीं है। मुझे पता है... :( – EMBarbosa

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

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