注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

【★★★★★】断言导致的进程崩溃!  

2010-07-30 18:58:34|  分类: 疑难杂症 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

使用AfxBeginThread创建的线程:
  if (m_thread->GetThreadHandle()!=NULL)
  {
   m_thread->PostThreadMessage(WM_QUIT, 0, 0);

   HANDLE handle=m_thread->GetThreadHandle();

   WaitForSingleObject(handle, INFINITE);
  }

WaitForSingleObject阻塞,直到线程退出。在线程退出后,程序崩溃。跟踪显示,WaitForSingleObject没有执行完,程序就没了。——应该是堆栈出错了?

 

解决!

        m_thread是继承于CWinThread的,使用AfxBeginThread创建基于m_thread的线程。在PostThreadMessage(WM_QUIT消息之后,线程进入CWinThread::ExitInstance中。

        反汇编跟踪CWinThread::ExitInstance函数,发现程序在调用AfxEndThread之后,进程退出了!——这只是一个子线程,所以,进程不应该退出。

        查看MSDN:

Call this function to terminate the currently executing thread.

void AFXAPI AfxEndThread(
   UINT nExitCode,
   BOOL bDelete = TRUE 
);

Collapse imageParameters

nExitCode

Specifies the exit code of the thread.

bDelete

Deletes the thread object from memory.


Collapse imageRemarks

Must be called from within the thread to be terminated.


        意思已经很明确了,AfxEndThread将调用delete 来删除m_thread对象。

        这也不应该导致进程崩溃,而且是毫无任何信息提示地崩溃,连堆栈都没法看到!

        继续跟踪m_thread的所有成员变量的构造函数,结果发现,程序在执行一处代码之后崩溃,代码如下:

ATLASSERT(FALSE);

        我习惯于加这样的断言,以FALSE为参量,也就是100%的中断。然而,让我意想不到的是,断言居然导致进程崩溃了!

        去掉断言之后,一切正常!

 

估计原因是,断言引发系统中断。而中断必然会保存旧的堆栈,同时压入新的堆栈信息。而在AfxEndThread结束线程的过程中,这种操作导致堆栈出错,进而进程崩溃。

 

By:zhanyonhu

  评论这张
 
阅读(896)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016