求助,程序崩溃提示:xx.exe遇到问题需要关闭。我们对此引起的不便表示抱歉。

彭家老三 2012-12-05 04:25:53
这程序在多台电脑上运行,不定时,不定位置,不定电脑会出现这种情况,程序的大致结构如下,只有最外围一个捕捉异常,内部的各种函数都没有try catch。在出现那个“xx.exe遇到问题需要关闭。我们对此引起的不便表示抱歉。”提示的时候,外围的catch没有捕捉到任何异常,我想问下各位大神,如果在每个调用的函数里都加上捕捉异常能捕捉到这样异常吗?引发这种情况的原因是什么?怎么解决?
void fun()
{
try
{
for(int i=1; i<n; i++)
{
switch (i)
{
case 1: fun1(); break;
case 2: fun2(); break;
case 3: fun3(); break;
...
case n: funn(); break;
}
}
}catch(){showmessage()};
}

void fun1()
{
fun11();
}

void fun2()
{
fun22();
}

...
void funn()
{
funnn();
}
...全文
660 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-12-07
  • 打赏
  • 举报
回复
或者开始、运行 drwtsn32 -i 然后查看崩溃产生的日志文件drwtsn32.log
赵4老师 2012-12-07
  • 打赏
  • 举报
回复
在崩溃的机器上安装C++Builder6.0
彭家老三 2012-12-07
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

对话框上只有一个关闭按钮,按了之后程序就关闭了。
yisikaipu 2012-12-06
  • 打赏
  • 举报
回复
引用 9 楼 pengjialaosan 的回复:
引用 7 楼 yisikaipu 的回复:Windows ?SEH打开没有? 是windows上运行的,C++builder6.0写的。
有些异常处理需要改变编译器选项的,否则默认恐怕只能捕捉到C++异常,系统异常捕捉不到的 参考一下VS的异常选项 /EH (Exception Handling Model) http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.90).aspx VS须设置为 /EHa 才能捕捉访问违规和系统异常 Under /EHs, catch(...) will only catch C++ exceptions. Access violations and System.Exception exceptions will not be caught.
franzhong 2012-12-06
  • 打赏
  • 举报
回复
catch未处理? 这些测试该测试人员先发现吧 务必找出触发bug的条件
彭家老三 2012-12-06
  • 打赏
  • 举报
回复
引用 7 楼 yisikaipu 的回复:
Windows ?SEH打开没有?
是windows上运行的,C++builder6.0写的。
赵4老师 2012-12-06
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
caimps 2012-12-05
  • 打赏
  • 举报
回复
应该是某一个或某几个fun有问题,所以才会不定时出错,如果不能去掉代码测试,可不可以手工设计输入,确定走某个分支,这样逐一测试
yisikaipu 2012-12-05
  • 打赏
  • 举报
回复
Windows ?SEH打开没有?
彭家老三 2012-12-05
  • 打赏
  • 举报
回复
引用 3 楼 smallnat 的回复:
1. 内部函数没有必要加上try.catch。最外层的try.catch要捕获尽可能全的异常,并在最后加上catch(...)。 2. 不定时,不定位的理解:是否可根据2#所说,排除一下,看看是否由某一个分支引起的问题。 3. 引起的原因:如果没有捕获异常,外层继续处理引发崩溃;在内部引发的崩溃(操作了不可操作地址等)。 排错,如果能打印日志,在每个入口都打印……
这种情况频繁的话半天出现一次,不频繁的话,几个月都不会出来一次。因为这是生产线上用的程序,也不可能只保留一个函数去试,所以不太可能用排除的方法。看起来只有通过日志分析了。
ziyue007 2012-12-05
  • 打赏
  • 举报
回复
一个fun一个fun的测试跟踪,虽然笨点但是效果还是不错的
prajna 2012-12-05
  • 打赏
  • 举报
回复
缩小范围,逐步排除,在加上一些打印,多点耐心,就会发现问题的原因。
hznat 2012-12-05
  • 打赏
  • 举报
回复
1. 内部函数没有必要加上try.catch。最外层的try.catch要捕获尽可能全的异常,并在最后加上catch(...)。 2. 不定时,不定位的理解:是否可根据2#所说,排除一下,看看是否由某一个分支引起的问题。 3. 引起的原因:如果没有捕获异常,外层继续处理引发崩溃;在内部引发的崩溃(操作了不可操作地址等)。 排错,如果能打印日志,在每个入口都打印日志,通过日志分析引起问题的地方。关键是能重现问题。
ardayoyo 2012-12-05
  • 打赏
  • 举报
回复
目前看来是内存的问题吧 一个办法,你保留switch中的一个case,其他的都注掉,依次调下去,应该能到到问题所在
  • 打赏
  • 举报
回复
这个要看是什么引起崩溃的啥,如果确定是异常的话,用catch(...) 可以捕获所有异常

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧