程序崩溃的原因及查找方法

Kinglin_sky 2009-05-07 10:08:21
在改一个VC 6.0写的 代码, 再退出程序时,有时会崩溃, 请问有可能是哪些原因造成的, 有哪些方法可以查找原因?
...全文
1479 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
LeviZhou 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Kinglin_sky 的回复:]
可是,大部分时间它是运行正常的, 是不是没崩溃时,程序没运行到崩溃的地方,还是错误没有发生呢!
[/Quote]
随机发生的bug基本都和内存操作不当有关系, 像缓冲区溢出之类的,
有可能你的某段内存操作的代码将某个指针给弄坏了,但用if(p) 检查 p 貌似还是有效的, 但引用p的时候会出问题。

你可以debug运行,出错时一定会有什么蛛丝马迹的, 我认为CallStack是可以给你很多信息,如果你的代码不是很庞大。

实在不行也可以生成一个带调试信息的Release版本,用K2Mon等工具抓个dump文件,之后用WinDbg分析。
antheazhang 2009-05-08
  • 打赏
  • 举报
回复
这种情况见得多了,我一般都是先“重新启动工程,清理解决方案,重新生成”,估计是反复生成解决方案时垃圾太多了(我猜的)。
zwtchy123 2009-05-08
  • 打赏
  • 举报
回复
uping
Allen_zhang 2009-05-07
  • 打赏
  • 举报
回复
调试,崩溃的时候查看堆栈信息,看看你的代码那里出错了
主要是指针,很多时候是指针和内存的问题
  • 打赏
  • 举报
回复
用Purify监测一下内存泄漏吧
Kinglin_sky 2009-05-07
  • 打赏
  • 举报
回复
谢谢各位的意见, 崩溃的概率大概是百分之一的样子, 奔溃时,弹出个提示框上面说什么内存 不能读?
zhourenyun 2009-05-07
  • 打赏
  • 举报
回复
还有可能是你内存越界,然后在删除的时候显示错误。
LeviZhou 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wutaihua 的回复:]
1、退出的时候,系统会回收资源,你这时候,如果有new出来的内存,没有delete掉的话,有可能出现。
2、还有一个就是访问已经销毁的资源,比如某个窗体,已经被销毁了,但是你退出的时候。继续有程序向其发消息,这样就会使用无效的空句柄,导致访问空资源引发崩溃。
3、程序崩溃的时候,一般都有点提示,看看output区和堆栈区。仔细找下蛛丝马迹,这都是锻炼出来的。而且不是太难,随着编程技术的提高,找这个也会驾轻就熟的…
[/Quote]

自己碰到的是饮用已销毁资源引起的多,尤其是饮用已销毁的指针成员。
一般crash时都会提示让你debug,可以看一下CallStack窗口,不知道VC6有没有,2003有,不行就转化一下,2003调试方便多了
wutaihua 2009-05-07
  • 打赏
  • 举报
回复
有一本书,叫《WINDOWS程序调试》,楼主可以下电子书来看。
wutaihua 2009-05-07
  • 打赏
  • 举报
回复
1、退出的时候,系统会回收资源,你这时候,如果有new出来的内存,没有delete掉的话,有可能出现。
2、还有一个就是访问已经销毁的资源,比如某个窗体,已经被销毁了,但是你退出的时候。继续有程序向其发消息,这样就会使用无效的空句柄,导致访问空资源引发崩溃。
3、程序崩溃的时候,一般都有点提示,看看output区和堆栈区。仔细找下蛛丝马迹,这都是锻炼出来的。而且不是太难,随着编程技术的提高,找这个也会驾轻就熟的。
zhourenyun 2009-05-07
  • 打赏
  • 举报
回复
1 你的数组 有没有越界
2 你NEW出来的指针 存放数据的时候有没有越界
3 看你的指针指向位置有没有变化 (重新定位)
4........其他高人补充
========================
利用CALL stack看下说不定能解决。
一般越界的话很难排查的,自己慢慢研究下代码吧。
个人意见。


Kinglin_sky 2009-05-07
  • 打赏
  • 举报
回复
可是,大部分时间它是运行正常的, 是不是没崩溃时,程序没运行到崩溃的地方,还是错误没有发生呢!

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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