51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 7121|回复: 11
打印 上一主题 下一主题

程序出现内存错误弹出提示调试对话框的时候如何处理

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2006-4-3 20:29:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发现个问题,在程序出现内存错误弹出提示调试对话框的时候(确定后程序异常结束,取消或关闭则进入调试程序(VC)),WR很难捉到这个窗口(SPY++可以正常获取),捕捉到窗口后定义EXCEPTION来处理也是无效的,这可能和WR的机制有关(不知道是不是?)
我的解决办法:自写DLL,开个工作者线程每隔一段时间去扫描一次,枚举所有窗口,如果找到指定的异常窗口则关闭(或给某个按钮发消息进行按钮的操作),WR通过接口函数启动和停止这个线程。但对于如何通知WR发现有这么个异常还没去考虑(好像不好办),只是在DLL作计数,停止时返回计数;异常恢复需要在WR中做(一般是在一个脚本的开头判断);这主要用于无人值守时的恢复
不知大家有没碰到过这个问题,有没有什么更好的解决办法,有的请提出来,大家共同进步
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2006-4-4 20:07:42 | 只看该作者
另外,对于环境的恢复,比如某个模式对话框因为有异常而没有关闭,导致下面的操作因为主窗口的非ACTIVE不可选状态而无法进行,用win_close关闭直接关闭主窗口又会失败,这样好像也只能采用类似上面的方法找到主窗口来关闭(不用启动线程定时扫描,父窗口关闭子窗口也会被销毁),实在想不到其它办法了
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2006-4-5 10:58:44 | 只看该作者
我怎么感觉我以前抓到过VC的窗口,难道是我记错了。如果抓不到的话,只能在脚本里给出提示报错的信息,然后退出脚本。如果是用final builder一类的工具批量调用脚本,应该可以实现自动化测试不中断。然后在整个测试结束时针对的测试可疑的脚本
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2006-4-5 11:00:54 | 只看该作者
对于不能active的被测程序主窗口可以做一个异常处理在进程里直接杀掉,需要做一个应用来杀进程,这是我的想法
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2006-4-5 20:38:48 | 只看该作者
看来我描述得不够清楚,试试下面的这个应用程序,按钮"错误"会去执行一条NULL指针的引用的语句,导致内存错误,这个错误对话框用WR很难捕捉到

[ 本帖最后由 shyfish 于 2006-4-5 20:43 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
回复 支持 反对

使用道具 举报

该用户从未签到

6#
 楼主| 发表于 2006-4-5 20:42:39 | 只看该作者
另外,关于窗口非ACTIVE,我是用EnumWindows API来找窗口,找到指定窗口,然后发送WM_CLOSE消息给它,让它自己去关闭(一般的WINDOWS的应用程序都默认有该关闭消息,即只要有"X"关闭的应该都有),用杀掉进程的方法太霸道了点,毕竟它只是非ACTIVE而非无响应
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2006-4-12 21:17:24 | 只看该作者
实践过程中发现:
1  在给WR调用的DLL开线程是比较不明智的, 因为WR脚本运行, 尤其是调试的时候, 很可能做了Init开了线程, 但是没有Uninit去关闭线程, 这样会出现错误, 因为没有去结束线程, 而且还是比较严重的; 后来改成用Timer来做, 才算解决了问题;
2  关于主程序为非Enabled时的关闭办法; 一般应用程序都有会新建或编辑一个工程或一个文档之类的, 如果采用WM_CLOSE, 这是应用程序自己去关闭, 虽然它的确是会去关闭它的上层窗口(模式/非模式对话框), 但是它会弹出一个提示保存的对话框, 这样, 应用程序还是无法结束(除非自己再加判断); 没办法, 只好采用结束进程的办法: 先枚举找到主程序窗口, 如果它是非Enabled的, 则找到它的进程并结束 (这不是只针对上面所说的程序错误窗口了)

不知道大家在使用过程中有没有类似的问题, 拿出来讨论下
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2006-4-17 11:31:19 | 只看该作者
两位高高手,我接触wr大概4个月了,你们说的我有点听不懂啊,我现在想问一下,让自己的测试脚本完全自动化(也就是遇到测试程序或者wr自身出现的问题时)设计的测试脚本仍然可以正常运行,可能吗?对于实际工作用处大吗?迷惑中...
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2006-4-17 15:00:28 | 只看该作者
我就顶,我就顶。跟帖学习。
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2006-4-17 15:50:44 | 只看该作者
原帖由 李文 于 2006-4-17 11:31 发表
两位高高手,我接触wr大概4个月了,你们说的我有点听不懂啊,我现在想问一下,让自己的测试脚本完全自动化(也就是遇到测试程序或者wr自身出现的问题时)设计的测试脚本仍然可以正常运行,可能吗?对于实际工作用 ...
当你的自动化脚本已经比较多,你需要1次验证多个用例时,当需要无人职守时,这个就会有意义了。
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2006-9-21 17:51:27 | 只看该作者
原帖由 shyfish 于 2006-4-4 20:07 发表
另外,对于环境的恢复,比如某个模式对话框因为有异常而没有关闭,导致下面的操作因为主窗口的非ACTIVE不可选状态而无法进行,用win_close关闭直接关闭主窗口又会失败,这样好像也只能采用类似上面的方法找到主窗口来关 ...



既然测试时候,都有异常产生了,脚本就没有必要再运行下去了吧?
我觉得就直接Kill应用程序的进程,然后退出报错。

还有win_close()这个函数不是较好。它有时候不是关闭程序进程的9(比如你关闭不料msn),win_close()模拟的就是去点击对话框的"ד,点击msn的这个"×",就是最小化了。

有两个办法:
1.WR打开任务管理器,在任务管理器中kill
2.真如你所说的,写dll去关闭进程。http://bbs.51testing.com/thread-43682-1-1.html
3.你如果要它弹出来kill掉它,就要加上时钟函数之类的(我还没有用过)

欢迎交流!

[ 本帖最后由 lzq123335 于 2006-9-21 17:56 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 2010-8-13 11:57:10 | 只看该作者

回复 1# 的帖子

我也碰到类似问题.
我们公司用的是自己搭建的测试工具,要求无人值守,连续运行多个案例.
现在遇到的问题是,当某个案例由于程序自身的问题弹出异常消息后,后面的脚本就无法运行了,除非点击一下异常对话框.
我也这么想:开个工作者线程每隔一段时间去扫描一次.我们用的是ruby语言,谁有经验具体怎么做?
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-8 05:31 , Processed in 0.085398 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表