在EnterCriticalSection中出现Crash
现象如下:
软件连续运行了大概2天多, 突然crash. 查看了下dump文件, 发现crash的地方是EnterCriticalSection.
刚开始觉得可能是没有初始化或者delete或者leave之类的问题, 但是检查了下code发现并问题. 之后看了下dump中的变量内容, 感觉很奇怪:
一共有3个临界区变量, 内容几乎全部为0, 包括debug info的指针和所有计数. 出问题的临界区变量里, 除了LockSemaphore之外所有成员都是0.
现在看来, 只有这3个临界区变量的值不太正确, 其他的变量似乎没什么异常.
后来才想可能是踩内存了, 不过怎么就恰好把这3个家伙踩了, 附近的变量(内存中前后的内容都没问题)没问题, 想不通.
各位有没有什么相关经验, 分享一下, 多谢了
[解决办法]
帮你顶下,之前也碰到过类似的一次CRITICAL_SECTION crash,
后来排查是cs在某个逻辑情况下被delete了,如果你可以排除这个原因的话,
那基本上是内存越界被覆盖了。
[解决办法]
看起来问题不是表面上显示的这样,进程崩溃后创建dump,各个线程的调用栈都会被dump出来。而处于等待状态的线程很大可能会卡在EnterCriticalSection、WaitForSingleObject、Sleep等函数上,这是很正常的。依我看,卡在EnterCriticalSection上的这个线程并非是导致崩溃的线程。
ps,EnterCriticalSection是很鲁棒的函数,我认为只要满足一下几点,此函数根本不会出问题
1、Enter与Leave同步使用
2、CriticalSection结构被正确初始化
3、CriticalSection结构所处的内存有效
4、全部在一个进程范围内使用
这个函数的返回值是void,说明它的稳定性很强,正确使用出问题的概率几乎为0