Как отладить переполнение буфера в Visual C ++ 9? - PullRequest
2 голосов
/ 22 июня 2010

У меня есть огромная оснастка MMC, написанная на Visual C ++ 9. Время от времени, когда я нажимаю F5 в MMC, происходит сбой mmc.exe. Если я присоединяю к нему отладчик, я вижу следующее сообщение:

В mmc.exe произошло переполнение буфера, которое повредило внутреннее состояние программы. Нажмите Break, чтобы отладить программу, или Continue, чтобы прервать программу.

Подробнее см. В разделе справки «Как отладить проблемы переполнения буфера».

Прежде всего, нет Как отлаживать проблемы переполнения буфера тема в любом месте.

Когда я проверяю стек вызовов, я вижу, что это, скорее всего, что-то с 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 функции на более безопасные версии, такие как wcscpy_s () . Я последовал совету, и это не приблизило меня к решению проблемы.

Как отладить мой код и выяснить, почему и где происходит переполнение буфера в Visual Studio 2008?

Ответы [ 4 ]

6 голосов
/ 24 апреля 2011

Добавить / RTC переключиться на компилятор. Это позволит обнаруживать переполнения буфера и опустошения во время выполнения. Когда будет обнаружено переполнение, программа остановится именно там, где это произошло, вместо того, чтобы выдать вам посмертное сообщение.

Если это не поможет, тогда изучите wcscpy_s () вызовов, которые вы упомянули. Убедитесь, что «количество элементов» имеет правильное значение. Я недавно исправил переполнение буфера, вызвавшее некорректное использование wcscpy_s (). Вот пример:

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

Обратите внимание, что buff + offset имеет элементы MAXSIZE - offset, а не MAXSIZE.

2 голосов
/ 15 апреля 2011

Минуту назад у меня была эта проблема, и я смог ее решить.Сначала я искал в сети безрезультатно, но попал в эту ветку.

В любом случае, я использую VS2005 и у меня многопоточная программа.Я должен был «угадать», какой поток вызвал проблему, но, к счастью, у меня есть только несколько.

Итак, что я сделал в этом потоке, я пробежал по отладчику, шагая по коду на функции высокого уровня,Я заметил, что это всегда происходило в одном и том же месте в функции, поэтому теперь это был вопрос детализации.

Другая вещь, которую я хотел бы сделать, это пройтись с открытым окном стека вызовов, убедившись, что стек выглядитхорошо, и просто замечаю, когда стек выходит из строя.

Я наконец сузился до линии, которая вызвала ошибку, но на самом деле это была не та строка.Это была линия до этого.

Так в чем причина для меня?Короче говоря, я попытался запоминать пустой указатель в допустимую область памяти.

Я удивлен, что VS2005 не может справиться с этим.

В любом случае, надеюсь, это поможет.Удачи.

1 голос
/ 22 июня 2010

Полагаю, вы не можете воспроизвести это надежно.

В прошлом я успешно использовал Rational Purify для выявления различных проблем с памятью, но это стоит $, и я не уверенкак он будет взаимодействовать с MMC.

Если нет какого-либо встроенного отладчика памяти, возможно, вам придется попытаться решить эту проблему программно.Можете ли вы удалить / отключить блоки функциональности, чтобы увидеть, проявляется ли проблема?

Если у вас есть «догадки» о том, где возникает проблема, вы можете попробовать отключить / изменить этот код.Даже если вы изменили функции копирования на _s версии, вы все равно должны иметь возможность надежно обрабатывать усеченные данные.

0 голосов
/ 06 апреля 2016

Я получил это переполнение, когда я хотел увеличить значение в переменной указателя следующим образом:

*out_BMask++;
вместо
(*out_BMask)++;

, где out_BMask был объявлен как int *out_BMask
Если вы сделали что-то вроде меня, то я надеюсь, что это поможет вам;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...