Вопрос
Я наблюдаю сбой в своем приложении, и стек вызовов показан ниже.
mfc42u!CString::AllocBeforeWrite+5
mfc42u!CString::operator=+22
Понятия не имею, почему это происходит.Это тоже происходит не часто.Любые предложения помогут.У меня есть аварийный дамп, но я не могу двигаться дальше.
Операция, которую я выполняю, выглядит примерно так
iParseErr += m_RawMessage[wMsgLen-32] != NC_SP;
где m_RawMessage — массив символов длиной 512.wmsglen не знака коротко, а nc_sp определяется как
#define NC_SP 0x20 // Space
РЕДАКТИРОВАТЬ:
Стек вызовов:
042afe3c 5f8090dd mfc42u!CString::AllocBeforeWrite+0x5 * WARNING: Unable to verify checksum for WP Communications Server.exe
042afe50 0045f0c0 mfc42u!CString::operator=+0x22
042aff10 5f814d6b WP_Communications_Server!CParserN1000::iCheckMessage(void)+0x665 [V:\CSAC\SourceCode\WP Communications Server\HW Parser N1000.cpp @ 1279]
042aff80 77c3a3b0 mfc42u!_AfxThreadEntry+0xe6
042affb4 7c80b729 msvcrt!_endthreadex+0xa9
042affec 00000000 kernel32!BaseThreadStart+0x37
Ну, это полный стек вызовов, и я опубликовал фрагмент кода, как в моем исходном сообщении.
Спасибо
Решение
У меня есть предложение, которое может вас немного расстроить:
CString::AllocBeforeWrite подразумевает, что система пытается выделить некоторую память.
Может быть, какая-то другая операция с памятью (в частности, освобождение или изменение размера памяти) была повреждена раньше?
Типичная проблема с управлением памятью C/C++ заключается в том, что ошибка при освобождении (или изменении размера) памяти (например, при двухкратном освобождении одного и того же ненужного объема памяти) не приведет к немедленному сбою системы, но может вызвать дампы гораздо позже - особенно при новом память должна быть выделена.
Ваша ситуация мне видится именно так.
Плохо то:
Может быть очень сложно найти место, где возникает настоящая ошибка — где куча изначально повреждена.
Это также может быть причиной того, что ваша проблема возникает только время от времени.Это могло зависеть от какой-то сложной ситуации заранее.
Другие советы
Я уверен, что вы проверили очевидное:wMsgLen >= 32