c++ - आपका पसंदीदा विंडबग टिप/चाल क्या है?



windows debugging (9)

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

ps: मैं निफ्टी कमांड की तलाश नहीं कर रहा हूं, जो दस्तावेज में पाए जा सकते हैं। ऐसा कुछ करने पर युक्तियाँ साझा करने के बारे में जो कोई अन्यथा कल्पना नहीं कर सकता है विंडबग के साथ किया जा सकता है? उदाहरण के लिए जब विंडबग के तहत एक प्रक्रिया चलती है तो स्मृति आवंटन के बारे में आंकड़े उत्पन्न करने का कोई तरीका।

https://ffff65535.com


.NET फ्रेमवर्क संस्करण (v2.0 / v4.0) के आधार पर SOS लोड करने के लिए स्क्रिप्ट:

!for_each_module .if(($sicmp( "@#ModuleName" , "mscorwks") = 0) ) 
{.loadby sos mscorwks} .elsif ($sicmp( "@#ModuleName" , "clr") = 0) 
{.loadby sos clr}

WinDbg के .heap -stat कमांड का उपयोग करें। यह कभी-कभी आपको गलत आउटपुट देगा। इसके बजाय, डीबगडिएग मेमोरी रिपोर्टिंग का उपयोग करें।

सही संख्या होने के बाद, आप WinDbg के .heap -flt ... कमांड का उपयोग कर सकते हैं।


कमांड इनपुट विंडो पर ध्यान केंद्रित करने के लिए एक अन्य उत्तर ने कमांड विंडो और Alt + 1 का उल्लेख किया। क्या किसी को माउस का उपयोग किए बिना कमांड आउटपुट विंडो को स्क्रॉल करना मुश्किल लगता है?

खैर, मैंने हाल ही में कीबोर्ड का उपयोग करके कमांड आउटपुट विंडो को स्क्रॉल करने के लिए AutoHotkey का उपयोग किया है और कमांड इनपुट विंडो को छोड़ दिए बिना।

; WM_VSCROLL = 0x115 (277)
ScrollUp(control="")
{
    SendMessage, 277, 0, 0, %control%, A
}

ScrollDown(control="")
{
    SendMessage, 277, 1, 0, %control%, A
}

ScrollPageUp(control="")
{
    SendMessage, 277, 2, 0, %control%, A
}

ScrollPageDown(control="")
{
    SendMessage, 277, 3, 0, %control%, A
}

ScrollToTop(control="")
{
    SendMessage, 277, 6, 0, %control%, A
}

ScrollToBottom(control="")
{   
    SendMessage, 277, 7, 0, %control%, A
}

#IfWinActive, ahk_class WinDbgFrameClass
    ; For WinDbg, when the child window is attached to the main window
    !UP::ScrollUp("RichEdit50W1")
    ^k::ScrollUp("RichEdit50W1")
    !DOWN::ScrollDown("RichEdit50W1")
    ^j::ScrollDown("RichEdit50W1")
    !PGDN::ScrollPageDown("RichEdit50W1")
    !PGUP::ScrollPageUp("RichEdit50W1")
    !HOME::ScrollToTop("RichEdit50W1")
    !END::ScrollToBottom("RichEdit50W1")
#IfWinActive, ahk_class WinBaseClass
    ; Also for WinDbg, when the child window is a separate window
    !UP::ScrollUp("RichEdit50W1")
    !DOWN::ScrollDown("RichEdit50W1")
    !PGDN::ScrollPageDown("RichEdit50W1")
    !PGUP::ScrollPageUp("RichEdit50W1")
    !HOME::ScrollToTop("RichEdit50W1")
    !END::ScrollToBottom("RichEdit50W1")

इस स्क्रिप्ट को चलाने के बाद, आप एक स्क्रीन स्क्रॉल करने के लिए कमांड आउटपुट विंडो, Alt + PgDn / PgUp की एक पंक्ति को स्क्रॉल करने के लिए Alt + ऊपर / नीचे का उपयोग कर सकते हैं।

नोट: ऐसा लगता है कि WinDbg के विभिन्न संस्करणों में विंडो और नियंत्रण के लिए अलग-अलग वर्ग नाम होंगे, इसलिए हो सकता है कि आप पहले वास्तविक वर्ग नामों को ढूंढने के लिए ऑटोहॉटकी द्वारा प्रदान की गई विंडो जासूस टूल का उपयोग करना चाहें।


कमांड और सीधा (स्थैतिक या स्वचालित) दिनचर्या जहां डीबगर का उपयोग किया जाता है, यह बहुत अच्छा है कि सभी डीबगर कमांड को टेक्स्ट कमांड फ़ाइल में चलाने के लिए सक्षम किया जाए और इसे kd.exe या cdb.exe के माध्यम से इनपुट के रूप में चलाएं। , एक बैच स्क्रिप्ट, आदि के माध्यम से कॉल करने योग्य

चलाएं कि जब भी आपको WinDbg को फायर करने और मैन्युअल रूप से काम करने के बिना, वही पुरानी दिनचर्या करने की आवश्यकता होती है। बहुत बुरा यह काम नहीं करता है जब आप सुनिश्चित नहीं हैं कि आप क्या खोज रहे हैं, या कुछ कमांड पैरामीटर को खोजने / प्राप्त करने के लिए मैन्युअल विश्लेषण की आवश्यकता है।


निम्नलिखित कमांड VTables के साथ C ++ ऑब्जेक्ट्स के स्टैक को देखते समय बहुत आसान होता है, खासकर जब रिलीज के साथ काम करते हैं तो कुछ चीजें अनुकूलित हो जाती हैं।

डीपीपी esp रेंज


डंप के रूप में एक मनमानी पीई फ़ाइल लोड करने में सक्षम होने के नाते साफ है:

windbg -z mylib.dll


क्वेरी GetLastError () के साथ:

! gle


यह सामान्य त्रुटि कोड को डीकोड करने में मदद करता है:

त्रुटि त्रुटि_ संख्या

प्रबंधित कोड के लिए प्लेटफ़ॉर्म-स्वतंत्र डंप स्ट्रिंग जो x86 / x64 के लिए काम करेगी:

j $ptrsize = 8 'aS !ds .printf "%mu \n", c+';'aS !ds .printf "%mu \n", 10+'

नमूना उपयोग यहां दिया गया है:

0:000> !ds 00000000023620b8

MaxConcurrentInstances

मैं उन्नत ब्रेकपॉइंट कमांड का उपयोग करना पसंद करता हूं, जैसे नए एक-शॉट ब्रेकपॉइंट्स बनाने के लिए ब्रेकपॉइंट्स का उपयोग करना।


मैं जिस "टिप" का सबसे अधिक उपयोग करता हूं वह वह है जो आपको उस अश्लील माउस को अक्सर स्पर्श करने से बचाएगा: Alt + 1

Alt + 1 कमांड विंडो में फोकस करेगा ताकि आप वास्तव में एक कमांड टाइप कर सकें और ताकि ऊपर-तीर वास्तव में कमांड इतिहास के माध्यम से स्क्रॉल हो। हालांकि, यदि आपका फोकस स्क्रॉल करने योग्य कमांड इतिहास में है तो यह काम नहीं करता है।

Peeve: फोकस स्रोत स्रोत में फोकस करते समय हेक महत्वपूर्ण प्रेस अनदेखा क्यों हैं? ऐसा नहीं है कि आप WinDbg के अंदर से स्रोत कोड संपादित कर सकते हैं। बचाव के लिए Alt + 1


  • .prefer_dml 1

    यह डीएमएल आउटपुट प्रदर्शित करने के लिए कई अंतर्निहित कमांड (उदाहरण के लिए, lm ) को संशोधित करता है जो आपको कमांड चलाने के बजाए लिंक पर क्लिक करने की अनुमति देता है। बहुत आसान ...

  • .reload /f /o file.dll ( /o आपके पास मौजूद प्रतीक की वर्तमान प्रति को ओवरराइट करेगा)

  • .enable_unicode 1 // डिबगर को स्ट्रिंग के लिए Unicode डिफ़ॉल्ट रूप से स्विच करता है क्योंकि सभी विंडोज घटक आंतरिक रूप से यूनिकोड का उपयोग करते हैं, यह बहुत आसान है।

  • .ignore_missing_pages 1 // यदि आप कर्नेल डंप विश्लेषण के बहुत सारे करते हैं, तो आपको स्मृति के बारे में बहुत सारी त्रुटियां दिखाई देगी। यह आदेश डीबगर को इस चेतावनी को फेंकने से रोकने के लिए बताएगा।

उर्फ उर्फ ​​उर्फ ​​...

डीबगर में कुछ समय बचाओ। यहां कुछ मेरी हैं:

aS !p !process;
aS !t !thread;
aS .f .frame;
aS .p .process /p /r
aS .t .thread /p /r
aS dv dv /V /i /t //make dv do your favorite options by default
aS f !process 0 0 //f for find, e.g. f explorer.exe




windbg