2015-02-07 3 views
-1

У меня есть проект, который последовательно вызывает два утверждения, ПОСЛЕ завершения «main'-function». Это очень проблематично, потому что это не показывает мне часть кода, вызывающую проблему.C++ - Как найти источник повреждения кучи/стека при выходе программы

Я смог немного уменьшить проблему. С пустой основной функцией:

int main(int argc,char* argv[]) 
{ 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    return main(__argc,__argv); 
} 

все работает нормально. Однако, как только я использовать любой класс или функцию из определенной библиотеки DLL (который является частью проекта), проблема начинается происходящим:

int main(int argc,char* argv[]) 
{ 
    Color col(255,0,0,255); 
    col.r += 1; 
    int r = HeapValidate(GetProcessHeap(),0,nullptr); 
    std::cout<<r<<std::endl; 
    return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    return main(__argc,__argv); 
} 

класса «Color» является частью этой библиотеки, но это не причина проблемы. «HeapValidate» возвращает 1, что означает, что куча действительна в соответствии с документацией.

В данной DLL содержится сотни тысяч строк кода, что еще более затрудняет отладку.

На подобный вопрос, я нашел предложение использовать WinDBG, но я не уверен, что делать с результатом:

http://pastebin.com/zV27b51Z

Это подтверждает, что этот вопрос является своего рода повреждения памяти , но я до сих пор не знаю, откуда оно происходит.

Есть ли способ надежно найти происхождение, или я застрял, используя пробную версию и ошибку?

Моя ОС Windows, 8,1, я использую Visual Studio 2013.

+0

DLL может иметь отдельную кучу: https://msdn.microsoft.com/en-us/library/windows/desktop/ee175820(v=vs.85).aspx Кроме того, посмотрите, не вызывает ли эта DLL что-либо подозрительное в его отрывном коде: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx – DCoder

ответ

0

запустить приложение под отладчиком и нажмите кнопку Retry в утверждении MessageBox. DebugBreak будет вызван, и отладчик примет coltrol.

+0

Это не работает, потому что проблема возникает ПОСЛЕ того, вызов уже возвращен. Отладчик больше не может вступать в этот момент. – Silverlan

+0

Укажите точное поведение программы. Как вы обнаружили, что произошли ошибки утверждения? – Nikerboker

Смежные вопросы