У меня есть многопоточное серверное приложение, которое отлично работает в течение первого цикла. 40 секунд (в это время приложение в основном ожидает только входящие пакеты). После этих 40 секунд он внезапно падает, хотя ничего не изменилось, клиенты не подключены, данные не отправлены и т. Д.
Отчет о сбое, который я получаю от Windows, выглядит так:
Problem signature:
Problem Event Name: APPCRASH
Application Name: myapplicationname.exe
Application Version: 0.0.0.0
Application Timestamp: 508d2a0b
Fault Module Name: StackHash_58df
Fault Module Version: 6.1.7600.16385
Fault Module Timestamp: 4a5bdb3b
Exception Code: c0000374
Exception Offset: 000cdcbb
OS Version: 6.1.7600.2.0.0.256.48
Locale ID: 1031
Additional Information 1: 58df
Additional Information 2: 58df710f17985997dec7b600103e4fd6
Additional Information 3: bc2b
Additional Information 4: bc2b581ed6e84cb4442c19134e8081d3
Я проверил возможные переполнения буфера, утечки памяти, но это не так (по крайней мере, я этого не заметил).
Кроме того, меня еще больше смутило то, что, если я скомпилирую его и запущу в Visual Studio (локальный отладчик Windows), эта ошибка не произойдет, никакого сбоя, все работает так, как должно. Я не знаю, с чего начать, чтобы это исправить, поскольку у меня никогда не было такой проблемы.
Я знаю, что сложно что-то диагностировать без кода, но слишком много кода, и я не могу ограничить его, так как не знаю, что вообще означает эта ошибка и с чем она связана. Я просто надеюсь, что кто-то сталкивался с чем-то похожим или знает, что означает эта ошибка. Пока я только нашел, как исправить подобные проблемы для других программ (переустановка приложения была ответом).
Грубое предположение:
У меня есть цикл опроса, который сильно напрягает один из моих потоков, так как я не дошел до того, чтобы реализовать весь код. Возможно ли, что DEP вызывается и останавливает мое приложение, чтобы защитить один из моих процессоров? -Добавил сон, но ничего не изменилось.
Код исключения: c0000374
Вы найдете эти коды исключений, документированные в заголовочном файле SDK ntstatus.h:
//
// MessageId: STATUS_HEAP_CORRUPTION
//
// MessageText:
//
// A heap has been corrupted.
//
#define STATUS_HEAP_CORRUPTION ((NTSTATUS)0xC0000374L)
Разрушение кучи, конечно, очень распространенная опасность программирования на C ++. Используйте распределитель отладки, доступный в crtdbg.h, если вы не можете найти ошибку.
Других решений пока нет …