首页
社区
课程
招聘
[原创]VS以Debug模式编译程序,printf会抛出异常
发表于: 2013-11-7 10:39 7510

[原创]VS以Debug模式编译程序,printf会抛出异常

2013-11-7 10:39
7510

我使用VS2005在Debug模式下测试异常的处理流程,在VEH的处理函数中有一个printf函数,打印输出一句话,编译后,不要在VS中运行,在编译目录中运行程序,程序运行后闪退,如果将printf输出语句替换为MessageBox弹出消息框,运行程序后将会弹出消息框进行提示。

我的代码中并没有发生异常的情况,那为什么VEH处理函数能够捕捉到哪?那是因为printf函数抛出了一个异常,这个异常被VectoredExpHandLer函数捕捉。

那么这就造成了一个问题,在VectoredExpHandLer函数中的printf会抛出了一个异常,这就导致了一个死循环:printf抛出异常 -> VectoredExpHandLer接收 -> printf抛出异常 -> VectoredExpHandLer接收…………,直到栈空间耗尽,OutputDebugString函数也有类似的效果,具体可参考:
VEH中的陷阱(上)神奇的API OutputDebugString
http://user.qzone.qq.com/31731705/blog/1314241757#!app=2&via=QZ.HashRefresh&pos=1314241757

LONG NTAPI VectoredExpHandLer(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
  printf("[VEH]VectoredExpHandLer\n");
  //::MessageBox(NULL, TEXT("[VEH]VectoredExpHandLer"), TEXT("异常"), MB_OK);
  return EXCEPTION_CONTINUE_SEARCH;
}
int main(int argc,char *argv[]) 
{
  // 向量化异常处理。
  AddVectoredExceptionHandler(1, VectoredExpHandLer);
  printf("按任意键继续...\n");
  getch();
  return 0;
}



测试方法可以使用OD调试进程,在VectoredExpHandLer函数处F2下断点,一直以F9直接运行。
在release模式下编译的printf不会抛出异常。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (4)
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
2
try catch 中包含 printf不会被catch住. (试验环境: vs2005 + winxpsp3)

请问: 用 AddVectoredExceptionHandler 好处是什么?
2013-11-7 17:56
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
try catch是经过编译器封装后的异常处理,这个没有被catch不代表没有产生异常,而可能是在语言内部作为已知异常处理掉了

VEH的好处是相对SEH的,你可以自己去找这方面的内容,而编译器的异常处理则是基于SEH的
2013-11-8 02:17
0
雪    币: 1753
活跃值: (840)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
try...catch只能接住SEH的异常
2013-11-9 08:53
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
异常不分SEH还是VEH,只有异常处理函数才区分
2013-11-11 08:53
0
游客
登录 | 注册 方可回帖
返回
//