Дамп памяти не записывается в режиме выпуска С++

Я использовал http://www.codeproject.com/Articles/1934/Post-Mortem-Debugging-Your-Application-with-Minidu, чтобы получить файл дампа из моего приложения, которое всегда дает сбой в другой системе.

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

В основном код, который я использовал,

void IndexFault(int n)
{
    unsigned char* smallArray = new unsigned char[4];
    printf((const char*)smallArray[n]);
}

MiniDumper* mDump = new MiniDumper("Dumpfile");

int main()
{
    IndexFault(4);
    return 0;
}

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


person SinisterMJ    schedule 19.12.2012    source источник
comment
На странице, на которую вы ссылаетесь: упоминаются только Windows XP и 2000, а дампер, похоже, работает только с исключениями. Возникает вопрос: вы уверены, что это должно работать с самого начала?   -  person Matthieu M.    schedule 19.12.2012
comment
Нет, у меня нет, но для отладки это работает абсолютно нормально.   -  person SinisterMJ    schedule 19.12.2012
comment
Я не эксперт в VC++, но вполне может быть, что режим Debug включает дополнительные проверки (такие как проверка границ), которые не включены в режим Release (по соображениям производительности), и что ваш код может полагаться на такой тест.   -  person Matthieu M.    schedule 19.12.2012
comment
Я бы использовал этот MiniDumper и скинировал его до минимума строк, которые все еще создают дамп. Затем посмотрите, работает ли это в режиме Release. Если в Debug работает, а в Release нет, то можно попробовать медленно превратить Debug в Release: включить оптимизации, поставить NDEBUG и т.д. Можно попробовать отладить и Release. Если ничего не помогает, опубликуйте код со скинами здесь, чтобы мы могли посмотреть.   -  person cxxl    schedule 20.12.2012


Ответы (1)


Я считаю, что вы пропустили этот шаг:

Чтобы вызвать API, вам нужно поймать сбой, установив обработчик необработанных исключений с помощью SetUnhandledExceptionFilter API. Это позволяет вызывать функцию фильтра практически в любое время, когда в приложении возникает необработанное исключение. В некоторых необработанных исключениях, таких как ошибка двойного стека, операционная система немедленно завершает работу приложения без вызова фильтра или JIT-отладчика.

Во всяком случае, я лично предпочитаю использовать WinDbg в таких случаях. Просто подключитесь к удаленному процессу и получите этот дамп.

person alekseyk    schedule 30.12.2012