Heisenbug: программа WinApi падает на некоторых компьютерах - PullRequest
8 голосов
/ 25 сентября 2008

Пожалуйста, помогите! Я действительно в своем уме. Моя программа - небольшой менеджер личных заметок (Google для "cintanotes"). На некоторых компьютерах (и, конечно, у меня нет ни одного из них) происходит сбой с необработанным исключением сразу после запуска. Ничего особенного в этих компьютерах сказать нельзя, за исключением того, что они, как правило, имеют процессоры AMD.

Среда: Windows XP, Visual C ++ 2005/2008, необработанный WinApi.

Вот что является определенным в этом «Гейзенбаге»:

1) Сбой происходит только в версии Release.

2) Сбой исчезает, как только я удаляю все, что связано с GDI.

3) BoundChecker не имеет жалоб.

4) Запись журнала показывает, что сбой происходит при объявлении локальной переменной int! Как это может быть? Повреждение памяти?

Любые идеи будут с благодарностью!

ОБНОВЛЕНИЕ: мне удалось отладить приложение на "неисправном" ПК. Результаты:

"Необработанное исключение в 0x0044a26a в CintaNotes.exe: 0xC000001D: недопустимая инструкция."

и разрывы кода на

0044A26A cvtsi2sd xmm1, dword ptr [esp + 14h]

Так что, похоже, проблема была в параметре компилятора «Генерация кода / Включить расширенный набор инструкций». Он был установлен на «/ arch: SSE2» и падал на компьютерах, которые не поддерживают SSE2. Я установил эту опцию на «Не установлено», и ошибка исчезла. Уф!

Большое спасибо всем за помощь !!

Ответы [ 11 ]

1 голос
/ 25 сентября 2008

Большинство ошибок heisenbugs / only-release происходят из-за потока управления, который зависит от чтения из неинициализированной памяти / устаревших указателей / последнего конца буферов, или от состояния гонки или от обоих.

Попробуйте переопределить ваши распределители, чтобы они обнуляли память при распределении. Проблема исчезнет (или станет более воспроизводимой?)

Запись журнала показывает, что сбой происходит при объявлении локальной переменной int! Как это может быть? Повреждение памяти?

Переполнение стека! ;)

...