首页
社区
课程
招聘
[旧帖] [求助]SEH疑惑 0.00雪花
发表于: 2012-3-12 18:04 1727

[旧帖] [求助]SEH疑惑 0.00雪花

2012-3-12 18:04
1727
大概问题:有一小程序,VC编译后,在出现异常(除0)前,没有发现SEH链注册上自己的异常处理函数。

程序如下:
#include <iostream>
#include <windows.h>

void fun1( int i)
{
       
        double f = (double) i;
       
        f *= 0.237;
       
        if ( i ^ ( i - i ) | 0x21 )
        {
                printf("The number is : %d\n", i);
                int j = (i+1) / i;
               
                fun1( j-1);
               
        }
        else
               
                return;
}

int main()
{
        int a;
        try
        {
                scanf("%d", &a);
                int j = 0x128;
                j *= 6;
                fun1(j);
        }
        catch( ... )
        {
                printf("You do it.\nBy BetaBin.\n");
        }
       
        Sleep(2000);
        return 0;
}

除0异常发生指令位置:

自己处理函数位置:

可是查看堆栈的SEH,没有发现自己的处理函数:




然后F9(我在自己的异常处理函数处加了断点),发现跳到我的异常处理函数中了。结果我试了几次,在00425DA0这个异常处理函数中发现了00401257,在内存0043A274中,不过后来设置内存断点,总是没有成功。所以暂时还找不到原因。

为什么我的catch里面的程序块不是被当成一个单独的异常处理函数?(VC编译)或者说VC的SEH包装到底是怎样的。?求解。

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1981
活跃值: (771)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
2

__try
{
xxx
}
__except(xxx)
{
xxx
}

这才是 SEH
2012-3-12 18:24
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看来我又粗心了。。谢谢指导。我再看看。

不过,那try{}catch{}和其有什么关系呢?
2012-3-12 18:55
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
4
try catch是C++异常处理
2012-3-12 19:22
0
雪    币: 183
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
调楼主的代码去了!发现问题在来讨论
2012-3-12 19:57
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
嗯,谢谢“代码疯子”。

不过我发现即使是用如下代码:
#include <stdio.h>

void divFunction()
{
	int x;
	scanf("%d", &x);
	printf("The result of 211 / x is: %d\n", 211 / x);
}

int main()
{
	printf("Hello BetaBin.\n");

	__try
	{
		printf("In the try block.\n");
		divFunction();
	}
	__except(1)
	{
		printf("In the except block.\n");
	}

	return 0;
}


在输入0的时候,还是没有发现SEH链有直接到达我的异常处理位置的块,暂时怀疑和之前的处理机制一样。好像还是被之前一个初始化的异常处理函数给处理了。然后应该在里面又调用了我这个块的。

会不会是对异常进行判断先?还是类似的?菜鸟表示不解。继续研究。。
2012-3-12 20:05
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
发现自己的处理函数在一块内存(43A274)里面,然后给那块内存设置断点,可就是没有发现到写入的地方,只有读取的。而且,貌似一开始加载完,那块内存就已经是处理函数地址了。

暂时还没找到原因。。郁闷中。
2012-3-12 21:02
0
游客
登录 | 注册 方可回帖
返回
//