Отладка сбоя после выхода? (После основного вернулся) - PullRequest
7 голосов
/ 16 января 2009

Это довольно сложная ошибка, и я попытался найти другие источники помощи, но по причинам, которые я не понимаю, «программные сбои в Vista» - не самый полезный запрос.

Проблема, с которой я сталкиваюсь, заключается в том, что программа, над которой я работаю - графическое многопоточное ПО для визуализации данных, использующее OpenGL и Windows API, - дает сбой после возврата WinMain (). Я попытался пройти процедуру завершения работы, а также посмотреть трассировку стека, и последний бит кода, который не является сборкой, - это _crtExitProcess, где происходит сбой при реальном вызове ExitProcess (0). После этого в трассировке стека отображаются kernel32.dll и четыре файла ntdll.dll, в которых он фактически падает.

Эта ошибка возникает только в Vista, и точно такой же код при запуске в XP завершается нормально. Я действительно не могу придумать ничего, что помогло бы мне отладить эту проблему, и отладка этой проблемы - это то, чего я никогда не изучал. Любая помощь будет оценена.

Ответы [ 2 ]

5 голосов
/ 16 января 2009

Я немного покопался и нашел несколько постов, в которых говорится, что вы не единственный, кто страдает от этого:

Особенно интересен второй, где Том Чм упоминает:

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

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

Возможно, вы захотите прочитать всю ветку и посмотреть, есть ли что-то, чему вы можете научиться. То есть, если вы еще не нашли эти сообщения в своем поиске, конечно.

3 голосов
/ 16 января 2009

Звучит как проблема с деструктором.

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

Попробуйте написать журнал, поскольку объекты уничтожены. например,

SomeClass::~SomeClass()
{
    WriteLog("Begin ~SomeClass()");
    // do whatever
    WriteLog("End ~SomeClass()");
}

WriteLog () должен открыть файл журнала, записать и затем закрыть файл, чтобы убедиться, что файл сброшен. Было бы неплохо использовать Mutex или CriticalSection, чтобы избежать конфликтов.

Просмотр журнала после сбоя может дать вам некоторые подсказки о том, что происходит.

...