c++ - CString 内崩溃

标签 c++ mfc crash-dumps

我观察到应用程序发生崩溃,调用堆栈如下所示

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++ 内存管理的一个典型问题是,释放(或调整大小)内存时出现的错误(例如两次释放相同的垃圾内存)不会立即导致系统崩溃,但可能会导致稍后转储 --特别是当要分配新内存时。

我觉得你的情况很像。

坏处是:

很难找到真正发生错误的地方——堆首先被​​损坏的地方。

这也可能是您的问题偶尔出现一次的原因。这可能取决于事先的一些复杂情况。

关于c++ - CString 内崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1742282/

相关文章:

c++ - 如何在CMake中添加 “-l”(ell)编译器标志

c++ - 使用指向指针的指针

mfc - 如何使用 COleDropTarget 为提升的 MFC 应用程序启用拖放

c++ - SDL 软件渲染 VS。 OpenGL : Compatability And Performance

c++ - 为什么我们说#define Processor 在程序中创建多个拷贝?

c++ - 有什么方法可以在 x < 8 的 Windows x 上从 native C++ 应用程序使用 XAML 和 WPF?

c++ - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);断言失败 : at afxwin1. inl

android - 如何获取有用的崩溃日志信息 Android Cocos2dx C++

windows - 从 Windows 用户模式转储文件中识别主机

c++ - 为什么 google breakpad 不能处理所有崩溃?我该如何调试这些案例?