0xc0000008 invalid handle 错误原因纪实

来源:互联网 发布:怎么做数据新闻 编辑:程序博客网 时间:2024/05/02 02:23

 关于调试时程序报 0xC00000008: Invalid Handle 错误的原因。

前几天在调试一个产品时,进入到某一个函数调试,在函数返回时, IDE开始报 "叉叉叉...0xC00000008: Invalid Handle " 的调试错误,此时按F10, 不能继续往下执行,只能转到汇编模式调试……这不明白着流氓吗!?我怎么能看得懂汇编……
来劲了,非要弄明白到底是什么原因导致了报这个叉叉叉错误。
捣鼓了好久好久,折腾了很长很长,但没有找到错误的原因……看来非的请我的偶像赵阳了,结果他来调了好久也是没找到根本原因,最后留下几句鸟语铩羽而归。我挺高兴,偶像竟然没搞定。
又请来了我的部门经理ZhangSY同志,他在我心目中的地位那绝对是“手中无剑,心中无剑”的N系列。
过然,他坐下来,还是那么的思路清晰,身手敏捷,而且凸显了超好的记忆力,N年前的代码,他都能记得请当时为什么要屏蔽,为什么要修改……经过一番望闻问切,把原因锁定在了xMutex这个类上,类的析构函数上!
其实这里最终的结果已经不远了,但还不是真正的原因所在。
我跟你铆上了!
世上从来就没有救世主,也没有神仙&皇帝……
看,瞅,吧嗒吧嗒整了整整一下午+ 一个晚上,额滴神啊,找到原因了:邱YL说的也很对。
class xMutex a;
struct var
{ int a;
  xMutex mtx;
};
var list; //此为全局变量
void fun1()
{
var temp;
memcpy(&temp, &list, sizeof(var); //问题出在此
.....叉叉叉操作....
return fool;// 跟踪到此处,报0xc00000008错误!
}
看明白了吗?
在函数fun1的作用域内,已经初始化过的全局变量list的值通过拷贝付给了局部变量 temp,
在函数出栈前,temp的声明周期结束,系统调用了内部mtx的析构函数将原本属于list的mtx对象给析构了!

据我发现,这个0xc00000008是一级异常(first chance exception!)。调试中出现一级异常只能终止。

------
今天写一个关于pe的程序,调试时又出现了这个008,出现异常附近的代码如下:
CJWPckDlg::~CJWPckDlg()
{
 if (m_hMapFl)
 {
  UnmapViewOfFile(m_hMapFl);
  CloseHandle(m_hMapFl); //执行此语句时报008错误。
  m_hMapFl = NULL;
 }
 
 为啥?
 我把m_hMapFl定义为HANDLEL类型,而事实上m_hMapfl = MapViewOfFile();本来MapViewOfFile应该返回一个DWORD类型的地址。
 当执行CloseHandle(m_hMapFl)时,非法句柄!

原创粉丝点击