
WinDbg में मेमोरी डंप और रुकी हुई लाइव प्रक्रियाओं का विश्लेषण करने के लिए Prolog का उपयोग करें।
एक स्थायी SWI-Prolog वर्कर के साथ एक मूल x64 और ARM64 WinDbg एक्सटेंशन। यह उपयोगकर्ता-मोड डंप या रुके हुए मूल x64 या ARM64 प्रक्रिया से थ्रेड्स, स्टैक फ़्रेम, प्रतीक, लोड किए गए मॉड्यूल और मेमोरी को उजागर करता है। अपनी स्वयं की Prolog फ़ाइलें लोड करें और डीबगर कमांड विंडो से क्वेरी चलाएँ।
संस्करण: 0.2.0 (प्रयोगात्मक; मूल ARM64 समर्थन)।
अपने डीबगर की आर्किटेक्चर के लिए बनी DLL का उपयोग करें। डीबगर, DLL और मूल लक्ष्य का मेल होना चाहिए: x64/AMD64 साथ में या ARM64 साथ में। क्रॉस-आर्किटेक्चर स्कोप कॉन्टेक्स्ट, WOW64, ARM32 और ARM64EC लक्ष्य इस रिलीज़ के दायरे से बाहर हैं। मूल x64 और ARM64 बिल्ड्स ने सभी 99 पोर्टेबल जाँचें और CDB डंप/लाइव स्मोक टेस्ट पास किए। रन, लॉग और शेष मैन्युअल जाँचों के लिए docs/VALIDATION.md देखें।
स्रोत रिपॉज़िटरी में संकलित बाइनरीज़ शामिल नहीं हैं। dist/x64/ या dist/arm64/ को भरने के लिए नीचे दिए गए Windows निर्देशों का उपयोग करके इसे बनाएँ। रिलीज़ आर्काइव का नाम PrologWinDbg-v0.2.0-win-x64.zip और PrologWinDbg-v0.2.0-win-arm64.zip है; प्रत्येक अपनी चयनित बाइनरीज़ को dist/ में रखता है। नीचे दिए गए उदाहरण उसी रिलीज़ आर्काइव लेआउट का उपयोग करते हैं। स्रोत बिल्ड के लिए, पथों में dist/arm64 या dist/x64 प्रतिस्थापित करें।
SWI-Prolog का Windows कंसोल संस्करण इंस्टॉल करें। मूल ARM64 इंस्टॉलर डेवलपमेंट डाउनलोड से उपलब्ध हैं। CI मैट्रिक्स दोनों आर्किटेक्चर पर मूल SWI-Prolog 10.1.18-1 का उपयोग करता है। SWI एक अलग प्रक्रिया के रूप में चलता है; यह DLL में लिंक या बंडल नहीं किया गया है।
dist/prolog.dll को dist/prolog और dist/examples निर्देशिकाओं के साथ रखें।
मेल खाते x64 या ARM64 WinDbg में एक मूल उपयोगकर्ता-मोड डंप खोलें, या उस आर्किटेक्चर की एक मूल प्रक्रिया से अटैच करें और उसमें ब्रेक करें। पुनरुत्पादनीय डंप के लिए, PowerShell में यह चलाएँ:
.\dist\prologdbg_target.exe --dump C:\Temp\prologdbg-sample.dmp
WinDbg में, इन पथों को अपनी वास्तविक प्रोजेक्ट निर्देशिका से बदलें। उद्धृत पथों में फ़ॉरवर्ड स्लैश का उपयोग करें: डीबगर बैकस्लैश को एस्केप के रूप में मानता है।
.load C:/PrologWinDbg/dist/prolog.dll
!prolog.runtime "C:/Program Files/swipl/bin/swipl.exe"
!prolog.info
!prolog.consult "C:/PrologWinDbg/dist/examples/patterns.pl"
!prolog.query wd:current_snapshot(S), wd:architecture(S,Architecture).
!prolog.query wd:current_snapshot(S), wd:thread_id(S,T,WindowsTid).
!prolog.query wd:current_snapshot(S), wd:stack_frame(S,T,Depth,IP).
!prolog.query wd:current_snapshot(S), patterns:stack_contains(S,T,Module,Function).
एक्सटेंशन स्पष्ट रनटाइम पथ, PROLOGDBG_SWIPL एनवायरनमेंट वेरिएबल, या मानक Program Files\swipl\bin\swipl.exe इंस्टॉलेशन का उपयोग करता है।
यह वर्कर को तब शुरू करता है जब पहली बार आवश्यकता होती है। सभी संचार स्थानीय पाइप का उपयोग करता है।
दिए गए लक्ष्य के लिए, ज्ञात आठ-बाइट मार्कर का निरीक्षण करें:
!prolog.query wd:current_snapshot(S), wd:lookup(S,'prologdbg_target!g_magic',ok(A)), patterns:inspect_magic(S,A,Verdict).
अपेक्षित परिणाम: matched(prologdb, Address)। मार्कर बाइट्स PROLOGDB बनाते हैं। लक्ष्य इन नामों को निर्यात करता है, इसलिए इस उदाहरण के लिए PDB की आवश्यकता नहीं है। निजी PDB अन्य फ़ंक्शन और अनुप्रयोगों के लिए उपयोगी होते हैं।
WinDbg के अंतर्गत prologdbg_target.exe --live लॉन्च करें। प्रारंभिक लोडर ब्रेकपॉइंट से आगे बढ़ें। इसके बाद लक्ष्य दो वर्कर थ्रेड्स शुरू होने के बाद CapturePoint पर रुकता है। डंप के लिए उपयोग की गई वही क्वेरीज़ का उपयोग करें।
वैकल्पिक रूप से, prologdbg_target.exe --wait चलाएँ, इसके प्रिंट किए गए PID से अटैच करें, और ब्रेक इन करें। यह मोड यदि पहले रोका न गया हो तो दस मिनट बाद बाहर निकल जाता है।
निष्पादन नियंत्रित करने के लिए सामान्य WinDbg bp, g, p, और t कमांड का उपयोग करें। प्रत्येक !prolog.query एक नया स्नैपशॉट एकत्र करता है। पंजीकृत Prolog ब्रेकपॉइंट क्रियाएँ और स्वचालित निरंतरता किसी बाद के संस्करण के लिए नियोजित हैं।
| कमांड | उद्देश्य |
|---|---|
!prolog.help | कमांड सहायता प्रदर्शित करें |
!prolog.runtime "absolute path to swipl.exe" | रनटाइम चुनें और किसी भी मौजूदा वर्कर को रोकें |
!prolog.info | वर्कर शुरू करें और उसका संस्करण रिपोर्ट करें |
!prolog.consult "absolute path to rules.pl" | Prolog स्रोत लोड या पुनः लोड करें |
!prolog.query Goal. | साक्ष्य एकत्र करें और समाधानों की गणना करें |
!prolog.queryfile "absolute path to goal.txt" | किसी फ़ाइल से एक UTF-8 गोल पढ़ें, फिर क्वेरी करें |
!prolog.eval Goal. | बिना डिबगर साक्ष्य के Prolog का मूल्यांकन करें |
!prolog.limits | वर्तमान सीमाएँ प्रदर्शित करें |
!prolog.limits 5000 100 128 10000000 | मिलीसेकंड, उत्तर गणना, प्रति थ्रेड फ़्रेम, और अनुमान सीमा सेट करें |
!prolog.reset | वर्कर रोकें; लोड किए गए नियम और कस्टम रनटाइम स्थिति खो जाती है |
सरल गोल सीधे कमांड के बाद पास किए जाते हैं। मानक Prolog एकल उद्धरण चिह्न एटम को सीमांकित करते हैं। आप अंतिम अवधि छोड़ सकते हैं। प्रति कमांड एक गोल का उपयोग करें, उप-गोल को अल्पविराम से जोड़ें। Prolog विच्छेदन (;) के लिए, पूरे गोल को दोहरे उद्धरण चिह्नों में संलग्न करें ताकि इसे WinDbg के कमांड विभाजक से बचाया जा सके:
!prolog.eval "(X=a;X=b), writeln(X)."
जटिल कोटिंग, यूनिकोड टेक्स्ट, या मल्टीलाइन गोल के लिए, गोल को एक UTF-8 टेक्स्ट फ़ाइल में रखें और !prolog.queryfile "C:/rules/goal.txt" का उपयोग करें। इसकी सामग्री सीधे Prolog में जाती है, WinDbg के कमांड-टेक्स्ट पार्सिंग को बायपास करते हुए। फ़ाइल सीमा 1 MiB है। पुन: प्रयोज्य लॉजिक के लिए, एक consulted .pl फ़ाइल में प्रेडिकेट्स परिभाषित करें।
लक्ष्य के बिना उदाहरण:
!prolog.eval member(X,[1,2,3]), Y is X*X.
उत्तर bindings([Name=Value, ...], ResidualGoals) के रूप में प्रिंट होते हैं। दूसरी सूची शेष प्रतिबंधों को सुरक्षित रखती है। एक अंतिम स्थिति समाप्त खोज, विफलता, उत्तर सीमाओं, अनुमान सीमाओं, टाइमआउट और अपवादों के बीच अंतर करती है। उत्तर सीमा तक पहुँचना यह दावा नहीं करता कि अधिक समाधान मौजूद हैं।
किसी फ़ाइल का परामर्श सामान्य Prolog लोडिंग और प्रारंभीकरण चलाता है। लोड त्रुटियाँ रिपोर्ट की जाती हैं, लेकिन Prolog लोडिंग लेन-देनात्मक नहीं है: कुछ क्लॉज़ त्रुटि से पहले लोड हो सकते हैं। फ़ाइल को ठीक करें और पुनः लोड करें, या वर्कर को रीसेट करें।
:- module(my_rules, [in_function/4]).
:- use_module('C:/PrologWinDbg/dist/prolog/wd.pl').
in_function(S, T, Module, Function) :-
wd:stack_frame(S, T, _, IP),
wd:symbol(S, IP, Module, Function, _).
फिर:
!prolog.consult "C:/rules/my_rules.pl"
!prolog.query wd:current_snapshot(S), my_rules:in_function(S,T,myapp,'ProcessRequest').
पूर्वानुमान मोड और साक्ष्य अर्थशास्त्र के लिए docs/API.md देखें। प्रारंभिक
नियम स्टैक मिलान, थ्रेड्स के बीच साझा फ़ंक्शन, स्पष्ट स्टैक
साक्ष्य, अपठनीय पते, और अनिर्णायक परिणाम के साथ एक मेमोरी-हस्ताक्षर निदान प्रदान करते हैं।
डिफ़ॉल्ट क्वेरी बजट 5 सेकंड, 100 उत्तर, प्रति थ्रेड 128 फ़्रेम, और
10 मिलियन अनुमान है। स्नैपशॉट संग्रह को समान आकार का अपना समय बजट प्राप्त होता है।
प्रारंभिक प्रतीक लोडिंग धीमी हो सकती है: प्रतीक कैश को गर्म करें या
!prolog.limits के साथ पहला मान बढ़ाएँ।
मेमोरी अनुरोध प्रत्येक अधिकतम 64 KiB और प्रति क्वेरी कुल 16 MiB हैं। स्नैपशॉट कैप्चर 4,096 थ्रेड्स, 4,096 लोडेड मॉड्यूल, और 8 MiB फ़ैक्ट टेक्स्ट तक सीमित है। वर्कर 512 MiB Prolog स्टैक सीमा और 768 MiB Windows प्रोसेस-मेमोरी सीमा का उपयोग करता है। नेटिव ब्रिज आउटपुट, RPC गणना, और IPC प्रतीक्षा समय को भी सीमित करता है।
किसी कमांड को बाधित करने के लिए WinDbg के Break एक्शन / Ctrl+Break का उपयोग करें। वर्कर की प्रतीक्षा करते समय या स्नैपशॉट आइटम्स को ट्रैवर्स करते समय, एक्सटेंशन GetInterrupt की जाँच करता है।
बाधित IPC वर्कर को रीसेट करता है; बाद में अपने नियमों को फिर से देखें। सामान्य
Prolog समय/अनुमान सीमाएँ वर्कर को सुरक्षित रखती हैं। वर्तमान कमांड लौटने के बाद !prolog.reset कमांड
उपयोग करने योग्य है; यह एक समवर्ती रद्दीकरण
कमांड नहीं है।
व्यक्तिगत DbgEng कॉल, विशेष रूप से प्रतीक लोडिंग और रिमोट रीड्स, सिंक्रोनस हैं। एक्सटेंशन कॉल के बीच बीता समय और रुकावट की जाँच करता है; यह कठोर समय-सीमा का वादा नहीं कर सकता जबकि DbgEng स्वयं अवरुद्ध है।