Вопрос

Я наблюдаю сбой в своем приложении, и стек вызовов показан ниже.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top