2012-01-05 16 views
12

मैं वर्तमान में एक छोटे डीबग ढांचे, अर्थात् एचडब्ल्यू ब्रेकपॉइंट्स के लिए अंतिम कार्य को कार्यान्वित कर रहा हूं। मैंने इस आलेख को अब तक संदर्भित किया है: http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx और एक डीबगर लिखने के बारे में एक पुस्तक।हार्डवेयरब्रेपपॉइंट WINAPI

मैं अब तक एक HW ब्रेकप्वाइंट स्थापित करने के लिए दो कार्य निम्नलिखित है:

void debuglib::breakpoints::hw_bp() { 
    HANDLE helper = 0; 

    CONTEXT co; 
    CURRENTCONTEXT(co); 

    helper = ::CreateThread(0,0,threadfunc,reinterpret_cast<void*>(co.Eip),0,0); 

    DWORD status = ::WaitForSingleObject(helper,INFINITE); 


    if (status != WAIT_OBJECT_0) { 
      ::MessageBoxA(0, "Helper thread didn't exit cleanly", "HWBreakpoint", MB_OK); 
    } 

    ::CloseHandle(helper); 
} 

static DWORD WINAPI debuglib::breakpoints::threadfunc(void* param) { 

    DWORD suspendcnt = ::SuspendThread(debuglib::process::thread()); 
    if(suspendcnt) { 
     return 0; 
    } 

    CONTEXT co; 
    ::ZeroMemory(&co,sizeof(co)); 
    co.ContextFlags = CONTEXT_DEBUG_REGISTERS; 

    BOOL ok = ::GetThreadContext(debuglib::process::thread(),&co); 

    if(!ok) { 
     return 0; 
    } 

    DWORD freeDr = 0; 
    DWORD condition = debuglib::breakpoints::TRIGGER::CODE; 
    DWORD length = debuglib::breakpoints::SIZE::SIZE_1; 

    co.Dr0 = reinterpret_cast<DWORD>(param); 

    co.Dr7 = co.Dr7 | 1 << (freeDr*2); 
    co.Dr7 = co.Dr7 | condition << ((freeDr*4)+16); 
    co.Dr7 = co.Dr7 | length << ((freeDr*4)+18); 

    co.ContextFlags = CONTEXT_DEBUG_REGISTERS; 
    ok = ::SetThreadContext(debuglib::process::thread(), &co); 

    co.ContextFlags = CONTEXT_DEBUG_REGISTERS; 
    ::GetThreadContext(debuglib::process::thread(),&co); 

    suspendcnt = ::ResumeThread(debuglib::process::thread()); 
    if(suspendcnt == 0xFFFFFFFF) { 
     return 0; 
    } 

    return 1; 
} 

तो सबसे पहले मैं के बाद से मैं वर्तमान धागा डिबगिंग एक सहायक धागा बना रहा हूं। सहायक धागे के कॉलबैक फ़ंक्शन के भीतर, मैं मुख्य धागे को निलंबित कर रहा हूं। बाद में मैंने मुख्य धागे के वर्तमान डीआर मूल्यों को पढ़ा (फिलहाल यह प्रासंगिक नहीं है, क्योंकि मैं हमेशा काम करता हूं, इस काम के बाद, मैं जांचता हूं कि कौन से रजिस्ट्रार मुक्त हैं और 4 बीपी तक उपयोग करते हैं)। बाद में मैंने कॉलिंग फ़ंक्शन (ईआईपी) का रिटर्न पता डीआर 0 में तोड़ने के लिए पते के रूप में इस्तेमाल किया और डीआर 7 में संबंधित झंडे सेट किए।

अंत में मैं मुख्य धागे को फिर से शुरू कर रहा हूं और सहायक समाप्त होने के बाद, सहायक धागे के हैंडल को बंद कर रहा हूं।

इस कोड मैं इस समस्या निम्न गया साथ

:

अगर मैं डिबग मोड में कार्यक्रम क्रियान्वित कार्यक्रमों सही पते पर रुकती है, लेकिन मैं अब और कुछ नहीं कर सकते, क्योंकि INT1 ध्वज सेट है मुझे लगता है कि और वी.एस. डीबगर एक-चरण आगे नहीं हो सकता है?

यदि मैं इसे सरल क्रैश डीबग किए बिना प्रोग्राम निष्पादित करता हूं। मैंने __try का उपयोग करने की कोशिश की, __except जैसा कि उल्लिखित प्रोजेक्ट (http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx) में है, लेकिन यह या तो काम नहीं करता है।

मैं सराहना करता हूं और मदद करता हूं या जानकारी देता हूं कि मैं क्या कर रहा हूं और इस समस्या को कैसे हल किया जाए।

+0

क्या आप मुझे बता सकते हैं कि आप जिस पुस्तक का उपयोग कर रहे हैं उसका नाम क्या है? मैं एक एचडब्ल्यू डीबगर विकसित करने में भी रूचि रखता हूं। –

+2

इसे "पायथन के साथ हैकिंग" कहा जाता है लेकिन यह जर्मन में लिखा गया है (http://www.amazon.de/Hacking-mit-Python-Fehlersuche-Programmanalyse/dp/3898646335/ref=sr_1_1?ie=UTF8&qid= 1325766641 और एसआर = 8-1)। – Chris

+0

धन्यवाद, मैं एक ही लेखक से अंग्रेजी में कुछ खोजने की कोशिश करूंगा। स्पष्टीकरण के लिए –

उत्तर

1

मुझे नहीं लगता कि प्रोग्राम को डीबग करने का प्रयास करना एक अच्छा विचार है। विंडोज़ में निर्मित डीबगर डेवलपमेंट एपीआई का उपयोग क्यों न करें?

देव केंद्र - डेस्कटॉप> जानें> संदर्भ> निदान> डिबगिंग और त्रुटि हैंडलिंग> बुनियादी डिबगिंग> डिबगिंग संदर्भ> डिबगिंग कार्य: http://msdn.microsoft.com/en-us/library/windows/desktop/ms679303%28v=vs.85%29.aspx

86 हार्डवेयर पर, एकल स्टेपिंग में जाल ध्वज की स्थापना करके सक्षम किया गया है eflags। एक निर्देश पूरा करने के बाद सीपीयू ब्रेकपॉइंट अपवाद उठाएगा। मुझे लगता है कि हो रहा है कि दृश्य स्टूडियो डीबगर झंडे के उस हिस्से को बदल रहा है, जो आप करने की कोशिश कर रहे हैं उसके साथ हस्तक्षेप कर रहे हैं।

दृश्य स्टूडियो (कोई डीबगर नहीं) के बाहर अपना प्रोग्राम चलाने का प्रयास करें। क्या यह तब अपेक्षित काम करता है?

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