我正在观察我的应用程序中的崩溃,并且调用堆栈显示在下面
mfc42u!CString::AllocBeforeWrite+5
mfc42u!CString::operator=+22
不知道为什么会这样。这也不经常发生。 任何建议都会有帮助。我有崩溃转储,但无法继续进展。
我正在执行的操作是这样的
iParseErr += m_RawMessage[wMsgLen-32] != NC_SP;
其中m_RawMessage是512长度的char数组。 wMsgLen是unsigned short 和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
这是完整的调用堆栈,我已经发布了原始消息中的代码片段
由于
答案 0 :(得分:4)
我有一个建议,对你来说可能有点令人沮丧:
CString :: AllocBeforeWrite确实暗示我,系统会尝试分配一些内存。
可能是,其他一些内存操作(特别是释放或调整内存大小)在以前被破坏了吗?
C / C ++内存管理的一个典型问题是,释放(或调整大小)内存时的错误(例如两次释放相同的内存垃圾)不会立即使系统崩溃,但可能导致转储更晚 - 特别是在分配新内存时。
你的情况很像我。
坏事是:
很难找到真正发生错误的地方 - 堆首先被破坏了。
这也可能是原因,为什么你的问题只会偶尔出现一次。它可能事先取决于一些复杂的情况。
答案 1 :(得分:1)
我相信你会检查明显的:wMsgLen> = 32