簡體   English   中英

如何在Visual C ++ 9中調試緩沖區溢出?

[英]How to debug a buffer overrun in Visual C++ 9?

我有一個用Visual C ++ 9編寫的巨大的MMC管理單元。每當我在MMC中遇到F5時,mmc.exe崩潰了。 如果我附加調試器,我會看到以下消息:

mmc.exe中發生緩沖區溢出,破壞了程序的內部狀態。 按Break可調試程序或繼續終止程序。

有關更多詳細信息,請參閱幫助主題“如何調試緩沖區溢出問題”。

首先,沒有如何在任何地方調試緩沖區溢出問題主題。

當我檢查調用堆棧時,我發現可能有一些安全cookie用於防止堆棧分配的緩沖區溢出:

MySnapin.dll!__crt_debugger_hook()  Unknown
MySnapin.dll!__report_gsfailure()  Line 315 + 0x7 bytes C
mssvcr90d.dll!ValidateLocalCookies(void (unsigned int)* CookieCheckFunction=0x1014e2e3, _EH4_SCOPETABLE * ScopeTable=0x10493e48, char * FramePointer=0x0007ebf8)  + 0x57 bytes  C
msvcr90d.dll!_except_handler4_common(unsigned int * CookiePointer=0x104bdcc8, void (unsigned int)* CookieCheckFunction=0x1014e2e3, _EXCEPTION_RECORD * ExceptionRecord=0x0007e764, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame=0x0007ebe8, _CONTEXT * ContextRecord=0x0007e780, void * DispatcherContext=0x0007e738)  + 0x44 bytes    C
MySnapin.dll!_except_handler4(_EXCEPTION_RECORD * ExceptionRecord=0x0007e764, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame=0x0007ebe8, _CONTEXT * ContextRecord=0x0007e780, void * DispatcherContext=0x0007e738)  + 0x24 bytes C
ntdll.dll!7c9032a8()    
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!7c90327a()    
ntdll.dll!7c92aa0f()    
ntdll.dll!7c90e48a()    
MySnapin.dll!IComponentImpl<CMySnapin>::GetDisplayInfo(_RESULTDATAITEM * pResultDataItem=0x0007edb0)  Line 777 + 0x14 bytes C++
// more Win32 libraries functions follow

我有很多代碼,不知道緩沖區溢出可能發生在哪里以及原因。 我找到了這個論壇的討論 ,特別是建議用更安全的版本,如wcscpy_s()替換所有類似wcscpy的函數。 我遵循了建議,並沒有讓我更接近問題的解決方案。

如何調試我的代碼並查找Visual Studio 2008發生緩沖區溢出的原因和位置?

添加/ RTC切換到編譯器。 這樣可以在運行時檢測緩沖區溢出和欠載。 當檢測到溢出時,程序將完全打破它發生的位置,而不是給你死后的消息。

如果這沒有幫助,那么調查你提到的wcscpy_s()調用。 驗證“元素數量”是否具有正確的值。 我最近修復了緩沖區溢出導致wcscpy_s()的錯誤使用。 這是一個例子:

const int offset = 10;
wchar_t buff[MAXSIZE];
wcscpy_s(buff + offset, MAXSIZE, buff2); 

請注意,buff + offset具有MAXSIZE - 偏移元素,而不是MAXSIZE。

我剛剛解決了這個問題,我能夠解決它。 我首先在網上搜索沒有用,但我得到了這個帖子。

無論如何,我正在運行VS2005,我有一個多線程程序。 我不得不'猜測'哪個線程導致了問題,但幸運的是我只有一些。

所以,我所做的就是在那個線程中,我通過調試器,在高級函數中逐步執行代碼。 我注意到它總是發生在函數的同一個地方,所以現在是鑽井的問題。

我要做的另一件事是逐步打開callstack窗口,確保堆棧看起來沒問題,只是注意到堆棧何時出現問題。

我終於縮小到導致這個bug的行,但實際上並不是那條線。 這是它之前的界限。

那么我的原因是什么? 好吧,簡而言之,我試圖將一個NULL指針memcpy到一個有效的內存區域。

我很驚訝VS2005無法處理這個問題。

無論如何,希望有所幫助。 祝好運。

我假設你無法可靠地重現這一點。

我過去成功地使用了Rational Purify來解決各種內存問題,但它花費了多少錢而且我不確定它會如何與MMC交互。

除非有某種內置內存調試器,否則您可能必須嘗試以編程方式解決此問題。 您是否能夠刪除/禁用功能塊以查看問題是否自行顯現?

如果您“猜測”問題發生的位置,您也可以嘗試禁用/更改該代碼。 即使您將復制功能更改為_s版本,您仍然需要能夠可靠地處理截斷的數據。

當我想在這樣的指針變量中遞增一個值時,我得到了這個溢出:

*out_BMask++;
代替
(*out_BMask)++;

其中out_BMask被聲明為int *out_BMask
如果你做了像我這樣的事情,那么我希望這會對你有幫助;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM