首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于内存访问错误

2012-10-14 
关于内存访问异常如果被调试器程序 有个内存访问异常我选择不处理 为什么错误框没有弹出来---------------

关于内存访问异常
如果被调试器程序 有个内存访问异常
我选择不处理 为什么错误框没有弹出来 

----------------------
1.程序发生了一个异常,Windows捕捉到这个异常,并转入内核态执行。

2.Windows检查发生异常的程序是否正在被调试,如果是,则发送一个EXCEPTION_DEBUG_EVENT调试事件给调试器,这是调试器第一次收到该事件;如果否,则跳到第4步。

3.调试器收到异常调试事件之后,如果在调用ContinueDebugEvent时第三个参数为DBG_CONTINUE,即表示调试器已处理了该异常,程序在发生异常的地方继续执行,异常分发结束;如果第三个参数为DBG_EXCEPTION_NOT_HANDLED,即表示调试器没有处理该异常,跳到第4步。

4.Windows转回到用户态中执行,寻找可以处理该异常的异常处理器。如果找到,则进入异常处理器中执行,然后根据执行的结果继续程序的执行,异常分发结束;如果没找到,则跳到第5步。

5.Windows又转回内核态中执行,再次检查发生异常的程序是否正在被调试,如果是,则再次发送一个EXCEPTION_DEBUG_EVENT调试事件给调试器,这是调试器第二次收到该事件;如果否,跳到第7步。

6.调试器第二次处理该异常,如果调用ContinueDebugEvent时第三个参数为DBG_CONTINUE,程序在发生异常的地方继续执行,异常分发结束;如果第三个参数为DBG_EXCEPTION_NOT_HANDLED,跳到第7步。

7.异常没有被处理,程序以“应用程序错误”结束。
---------------------------------------------------
这是我找的一个异常的资料

OD里 第一次执行到内存访问错误处 会给出个提示 相当于调试器第一次接收到异常消息

如果选择往上抛 并且被调试程序没有处理该异常 应该会弹出个错误框 相当于第四步
4.Windows转回到用户态中执行,寻找可以处理该异常的异常处理器。如果找到,则进入异常处理器中执行,然后根据执行的结果继续程序的执行,异常分发结束;如果没找到,则跳到第5步。

最后又抛给调试器该异常  

可是我写的调试器 系统并没弹出个内存访问错误提示框 求解

代码就一句

else if (n == EXCEPTION_ACCESS_VIOLATION)
  {
  dwCountinueStatus = DBG_EXCEPTION_NOT_HANDLED;

   
  }

 


[解决办法]
你说的那个弹框是0xxxxxx 不可读的那个么

另外你不处理之后 最后进程被终止了么

/////////////////////// 下面是我的推测

弹出一个窗口这种事 好可疑 似乎只有win32子系统才做得出来

我记得有这么一个步骤 是在你的调试器第二次没处理之后

在没有调试端口的情况下 如果存在一个异常端口 会发送消息到异常端口交给win32子系统处理

如果win32子系统处理了该异常 返回并继续执行 否则 进程被终止

所以我猜是因为有调试器 所以有调试端口 所以不会进入使用异常端口的逻辑 所以就没有那个框框喽

如何

热点排行