怎样捕捉AV(Access violation)?

hexenzhou 2003-04-14 02:07:33
AV(Access violation)内存存取错误是经常会发生的事情,通常是使用了失效的指针,或是忘了回收分配的内存空间所引起的资源泄漏造成的。在运行期间产生的AV还好捕捉,至少大体上知道AV出现在什么地方。然而在退出程序时所引起的AV则最难捕捉。如果您也遇到了这样的情况,那么恭喜您,您遇到了和我一样的令人头痛的问题。
如果是第三方控件在退出程序时引起的AV,而这种AV又不是经常会发生,只是偶尔发生,那么又该怎么办了呢?我的应用程序使用了好多第三方控件,当然如果知道是哪个控件引起了AV,我最多不使用这个控件,问题的关键是我不知道是哪个控件引起了AV,总不能把第三方控件一梆子打死,全部不使用吧?

通常在运行期产生的AV,delphi会跳出对话框,其中会有一个“View CPU”的选项,通过查看CPU窗口,大体知道AV出现在什么地方。而退出程序所引起的AV,则不会有“View CPU”的选项,通常这个对话框是操作系统产生,不是Delphi调试环境产生的,比如这个AV对话款“Exception EAcessViolation in module Project1.exe at
00027564,access violation at adress 00427564 in module 'Project1.exe' write of Adress 001470785”。
请问各位是否有调试这类AV的高招,望不啬赐教,在下不深感激。
...全文
93 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
microjuz 2003-05-16
  • 打赏
  • 举报
回复
不是不关注,是说不上来,多线程的东东还不是很明白:)
hexenzhou 2003-05-03
  • 打赏
  • 举报
回复
怎么没人关注.......失望..........
hexenzhou 2003-04-16
  • 打赏
  • 举报
回复
有谁用过TurboPower 的Memory Sleuth 3?我手里有,但是不知道怎么用。我想借助一些捕捉资源泄漏的工具,听说还有内存清道夫,不知各位是否有用过?
luckyboy97 2003-04-15
  • 打赏
  • 举报
回复
关注
rustle 2003-04-15
  • 打赏
  • 举报
回复
搞大了,关注...
hexenzhou 2003-04-15
  • 打赏
  • 举报
回复
我猜想之所以不能捕捉是因为主线程已经结束,而附属线程还没有结束,它可能有时是来不及结束,附属线程访问了主线程的资源才造成的这个AV,因此在主程序加异常处理代码没法捕捉,因为主线程已经结束了。
hexenzhou 2003-04-15
  • 打赏
  • 举报
回复
To rustle:我以前也有这么试过,但是无效,这个AV不是Delphi的异常处理所能捕捉的,它好像是操作系统产生的,以前试了在项目的dpr文件加上异常处理代码,但也是无效。
看来这个AV的确非常麻烦。
rustle 2003-04-14
  • 打赏
  • 举报
回复
实在捕捉不了的时候这么干

OnApplicationException

if E is EAccessViolation then exit else Application.ShowException(E);

在程序发布的时候很有用的
gototop99 2003-04-14
  • 打赏
  • 举报
回复
那么就

sleep

一会,

然后在关闭,test。。。。。
hexenzhou 2003-04-14
  • 打赏
  • 举报
回复
TStrings是抽象虚拟类,不能直接创建TStrings的实例,只能创建它的派生类,一般的控件都会产生TStrings的派生类以实现自己的字符串容器,比如很多控件的Items属性。
hexenzhou 2003-04-14
  • 打赏
  • 举报
回复
to FrameSniper:我清除了我写的所有程序代码,只保留添加控件时自动产生的代码,在程序退出时有时会产生AV,但在运行时不会产生,可以肯定是退出程序时产生的。
我现在不大有效的调试手段是:记录下AV发生的地址,比如上面那个AV的地址为:00427564
在程序运行时,按ctrl + Alt + C调出CPU窗口,接着在CPU窗口按右键选择go to adress,在输入框输入上述地址为:00427564,在该地址处打上断点跟踪,只能跟踪到在执行TString.SetValue时产生了AV,但是我不知道是哪个控件在退出时调用了它。
FrameSniper 2003-04-14
  • 打赏
  • 举报
回复
直接在程序快结束的地方设置断点,然后进入CPU窗口用单步跟踪不可以吗?

你怎么知道你的AV是在程序结束后产生的????
hexenzhou 2003-04-14
  • 打赏
  • 举报
回复
Moj(Delphi fan) :难得遇到同病相怜者,本人深受这种AV之苦,但又无可奈何。
lvloj 2003-04-14
  • 打赏
  • 举报
回复
hexenzhou (甲骨文) : 同苦!
rwdx(任我独行之浪迹天涯) :单步跟踪不行啊,问题是程序闭时随机出现,而几率不高,但又不是非常低.(我能接受,但用户可能不能).跟踪时又不出现.
hexenzhou 2003-04-14
  • 打赏
  • 举报
回复
由于第三方控件使用了多线程技术,这些控件在退出程序时引起的AV,我想可能和线程同步有关。但我不知道是那些控件产生了线程,只能通过Debug windows下Threads查看线程Id,总共有8个线程,除了主线程外,其余的线程不知道是那些控件产生的。而且这种AV有极大的不确定性,只是偶尔会发生。
rwdx 2003-04-14
  • 打赏
  • 举报
回复
单步跟踪

5,929

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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