Windows создала точку останова - PullRequest
2 голосов
/ 11 ноября 2011

Я отлаживаю свою программу на C ++ Win32 в VS2010 и всегда получаю сообщение «Windows запустила точку останова в program.exe».

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

В нем задействовано довольно много кода (конструкторы, деструкторы, оконные сообщения, выделение и освобождение памяти и т. Д.), Так что это довольноздесь трудно что-то конкретное поставить, но в то же время я понимаю, что без кода вы ничего не сможете сделать, чтобы дать объяснение.

По сути, при нажатии кнопки открывается окно, которое показываеткартинка.Если определенное условие выполнено, я отправляю WM_DESTROY в это окно и удаляю переменную, которая вызывает деструктор, который вызывает Release() на моем LPPICTURE, и освобождаемая переменная устанавливается на NULL.

Затем, когда пользователь снова нажимает кнопку, он пытается динамически выделить новый экземпляр (точно так же, как это делалось ранее), и именно здесь генерируется точка останова.AFAIK (и я пытался отлаживать это больше часа), конструктор даже не запускается.Кажется, что он разрывается внутри функции new() для динамического выделения памяти.

Насколько я могу судить, он разбивается на return HeapAlloc(_crtheap, 0, size ? size : 1);, что в строке 54 или malloc.c

Чтостранно, что когда я запускаю exe вне VS2010, все продолжается нормально.Программа не вылетает и продолжает работать как положено!

Ответы [ 3 ]

6 голосов
/ 11 ноября 2011

Трудно диагностировать, не видя код, но на основании вашего описания это звучит как повреждение кучи.Я предполагаю, что HeapAlloc обнаружил повреждение и сгенерировал int 3, который по существу вызовет точку останова в отладчике.Мой совет - проверить все ваши распределения / освобождения объектов и убедиться, что вы не наступаете на память, которую вы не выделили (или которая уже была освобождена).

Кроме того, вы упомянули, что выотправив сообщение WM_DESTROY явно.Как правило, вы хотите, чтобы Windows генерировала для вас сообщение WM_DESTROY, либо позвонив по номеру DestroyWindow, либо отправив WM_CLOSE в окно и разрешив DefWindowProc позвонить DestroyWindow.Это может быть не связано с вашей проблемой, но только к вашему сведению.

2 голосов
/ 11 ноября 2011

По моему опыту, когда это происходит, у вас есть исправление кучи / использование неверного указателя.Точка останова возникает в точке, где обнаружена неисправность.Это почти никогда не фактический сбой - проблема возникла ранее.Эти типы точек останова возникают только при наличии отладчика.Много раз повреждение не является фатальным или даже исправляется каким-либо другим действием.

В любом случае вы должны рассмотреть appverifier , чтобы увидеть, может ли он найти проблему.Обязательно используйте параметры проверки кучи.

0 голосов
/ 11 ноября 2011

Я думаю, что проблема в том, что если вы отлаживаете в Visual Studio, вы должны поместить необходимые файлы (в данном случае это изображение, о котором вы говорите), файлы в определенный каталог в папке отладки, программа вылетает (при отладке), потому что он не находит файл, поэтому при запуске exe вне VS2010 он не падает

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