登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: 关于(SEH)windows异常的问题..[zt 为什么不能捕获的异常]     [回主站]     [分站链接]
标题
关于(SEH)windows异常的问题..[zt 为什么不能捕获的异常]
我是马甲
浏览(0) + 2007-09-10 14:24:28 发表 编辑

关键字:

关于(SEH)windows异常的问题..[zt 为什么不能捕获的异常]

关于(SEH)windows异常的问题,需要专家指点。如果你想让自己的程序再强壮点那么就进来讨论吧!
楼主baobao(天下草木皆能当剑)2002-02-01 23:00:54 在 VC/MFC / 非技术类 提问

我编写的服务器器程序(基于winsock2的游戏服务器),经常运行一两天进程就自动结束了。(不弹出任何对话框,那台win2000上什么都没装,可能默认是不弹包错的)
我想可能是程序的问题:于是我使用自己的异常未处理代替系统的函数,在进程开始时就设置上了。自己的函数功能:枚举错误,记日志,返回1。这样我就可以知道程序在什么地方出错.
可是奇怪的事发生了,程序还是自动结束,不知何时就消失了。没有记日志。
程序已经测试过 把int i=0;i=5/0;插入程序个部分都会记日志。
按《windows核心编程》说,程序发生异常如果没有__try到,会发生未处理异常,而且会调用系统默认函数或其替代函数。
可是我的程序没有执行这个函数,为什么?
有几点不懂:
1:程序除了异常导致自动结束,还有什么其他途径导致结束,正常退出(可我的程序还有个任务栏的界面程序,没人动不会退出),其他程序把他KILL,系统会这么干吗?还有其他的原因吗?
2:如果有异常就应该记日志啊,难道还有什么情况不调用未处理异常函数?
3:和winsocket有关吗,我的程序一般也就30 --40人在线。

恳请高手,DX帮助,我觉得这些迹象有些矛盾,不知道是不是我的某些理解有错误。谢谢!



问题点数:0、回复次数:17
Top

1 楼masterz(www.fruitfruit.com)
回复于 2002-02-01 23:43:22 得分 0

http://spiff.tripnet.se/~iczelion/Exceptionhandling.html
记得有书上说过,如果你的程序破坏了堆栈(或许是其他导致不能继续执行下去的数据结构),系统会直接关闭你的程序
Top
2 楼Tine(唐斩)
回复于 2002-02-02 11:44:25 得分 0

一般是内存溢出造成的。仔细检查你的程序。特别是内存分配,sprintf strcpy memcpy等语句
Top
3 楼smartnose(smartnose)
回复于 2002-02-02 12:24:22 得分 0

多线程长时间运行的程序,应该分配一个大的缓冲池,每次内存分配用静态指针的方式进行。也就是说尽可能的只用一次NEW。其他的分配应在缓冲池中进行
Top
4 楼baobao(天下草木皆能当剑)
回复于 2002-02-02 12:25:48 得分 0

内存溢出算异常吧,应该可以捕获啊。
另外那台机器是2cpu的有没有关系?我想知道有什么是__try捕获不到的?
Top
5 楼baobao(天下草木皆能当剑)
回复于 2002-02-02 12:45:02 得分 0

我的线程是经常new结构来互相传递信息,用完后便delete.你讲的大的缓冲池是什么概念能详细说说吗?(最好给个简单的例子说明)以及为什么要这样做,不胜感激!!
Top
6 楼joshua0137(joshua)
回复于 2002-02-02 14:14:08 得分 0

gzup
Top
7 楼lhj(努力加油)
回复于 2002-02-02 14:19:23 得分 0

只要是本线程中的错误,比如内存益处,/0
_try{
}
_except(...){
}
都可以截获,不能截获的是
1,其他线程的错误,比如CSocket会创建新的线程,捕获不到。
2,MFC的某些抛出的异常捕获不到。
3,COM的异常通常不能通过该方式捕获
4,new 的内存使用超界,delete导致的异常。
Top
8 楼kissfire(kissfire)
回复于 2002-02-02 15:17:57 得分 0

sign
Top
9 楼baobao(天下草木皆能当剑)
回复于 2002-02-02 16:17:39 得分 0

to lhj
1:我的程序没有使用CSocket,用的是api函数
2:lhj:能否举个mfc抛出的__try __except捕获不到的异常的例子,我想做个实验以验证。
3:我没有用到COM
4: 给个例子好吗,我非常需要。
谢谢!





Top
10 楼sohohome(三层肚皮)
回复于 2002-02-02 20:03:11 得分 0

我也正为此事苦恼。学习一下。
Top
11 楼smartnose(smartnose)
回复于 2002-02-03 11:30:44 得分 0

4G的虚拟内存也会因为碎片过多而崩溃.何况你的程序还只能是 使用1G
new的分配是在应用程序堆上分配的.你即是网络游戏,那么字符串可以放在字符缓冲池中. (见数据结构).而其他的固定大小的数据.比方可能要用到500个用户的数据.则可以在程序启动时分配一个1000 个单元的数组,建立空闲单元的索引, 每次从中 取一个存放.不要 想到什么时候要内存了就用NEW去分配.

而且你最好不要用NEW.用HeapAlloc或者GlobalAlloc分配可移动内存.这些内存是系统可移动的,从 而避免碎片出现.只是使用时比较麻烦,要先锁定. 可以看< WINDOWS核心编程>
Top
12 楼masterz(www.fruitfruit.com)
回复于 2002-02-04 15:26:19 得分 0

#include
int main()
{
char szBuff[1];
for(char *pBuff = szBuff;;pBuff++)
*pBuff = '$';
printf("I'll never reach Here !!\n");
return 0;
}

when run in a debugger gives the following error:
Unhandled exception in test1.exe: 0xC0000005: Access Violation
But does not display any sort of exception when run
outside a debugger and crash directly.

The system depends on information saved on the stack to unwind exceptions;
as the whole stack is trashed in this case, attempting to call the default
handler (which would display the error message box, and optionally attach a
debugger) will only result in a new exception, upon which the program will
be terminated immediately.

Under a debugger however, the system will suspend the program and notify the
debugger, giving it a chance to deal with the problem first.


#include
int main()
{
char szBuff[1];
for(char *pBuff = szBuff+1024;;pBuff++) // added the +1024
*pBuff = '$';
printf("I'll never reach Here !!\n");
return 0;
}

and I got these 2 errors...
The instruction at "0x0040b4cf" referenced memory at "0x00133000". The
memory could not be written
&&
The instruction at "0x77f84abe" referenced memory at "0x24242430". The
memory could not be read
That little jump ahead saved part of the stack !

Top
13 楼baobao(天下草木皆能当剑)
回复于 2002-02-05 09:24:21 得分 0

to masterz():
你给出的第一个例子确实捕获不到,非常感谢!
可是我如何在茫茫的代码中找到那条出错的语句。
有什么快捷的调试方法?望赐教。
Top
14 楼sohohome(三层肚皮)
回复于 2002-02-05 10:46:12 得分 0

怎样捕获#include
int main()
{
char szBuff[1];
for(char *pBuff = szBuff;;pBuff++)
*pBuff = '$';
printf("I'll never reach Here !!\n");
return 0;
}

的异常?0xC0000005无法捕获吗?
Top
15 楼baobao(天下草木皆能当剑)
回复于 2002-02-06 13:46:44 得分 0

请问大家是否遇到过这样的问题,如何调试?
Top
16 楼riflek()
回复于 2002-02-06 14:07:37 得分 0

我在编写服务器程序的时候也出现这种情况过,我也是用学日志的形式来调试,没什么反映的就退出了。后来一次偶然的机会发现一个内存溢出的错误修改后就没有再出现突然退出的情况。我也说不出什么原因,windows核心中好像有说过,当内存溢出时会访问一个专门的区域,从而引发访问违规,系统不进行提示的,程序就退出了。
Top
17 楼lownr(廖宇雷)
回复于 2002-02-06 23:25:08 得分 0

masterz真是厉害,都两个星星了。


总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1