如何在现场调试Access违规?

Rob*_*ank 15 delphi

该领域的应用程序间歇性地收到此消息:

替代文字

我无法在我的机器上重现这一点.我还跟踪了我认为的相关代码,无法找到任何未初始化对象的访问权限.

我从来没有处理过这种问题.

我使用madExcept进行了构建,不幸的是程序在捆绑后不会崩溃.

有关madExcept和EurekaLog的任何意见发现这种事情吗?我从未使用过FastMM.它会对他的情况有用吗?(Delphi 2010)在FastMM中设置的任何建议标志?还有其他建议吗?

Lor*_*tel 12

请注意您尝试阅读的地址非常低.这种错误几乎肯定意味着你试图取消引用nil指针,即使你找不到它.

鉴于你对行为的描述,我怀疑你有一个内存踩踏 - 有些东西在指向对象的指针顶部爆破零.当你改变东西时,你就会移动东西,然后踩踏就会变得无害.

打开范围检查和溢出检查.

请注意,违规对象的大小必须至少为3C0字节 - 这应该有助于缩小范围,大多数对象将小于此值.

我过去所做的只有在现场显示的错误是将记录检查点放入 - 一串显示某些东西的行 - 一个简单的数字序列就可以了.找出崩溃时显示的数字,并且您知道哪些检查点是最后执行的.如果这不能缩小到足够的范围,那么现在你可以重复这个过程.


Dav*_*nan 5

使用完整的映射文件,您可以识别代码中发生这种情况的确切位置.我希望你有一个完整的图像文件!从引发异常的地址(在您的情况下为$ 007ADE8B)中减去$ 00401000,并且对应于映射文件中的值.

完成后你知道哪个对象是零,从那里通常不会很难弄清楚发生了什么.

发生这种情况的最常见方法之一是构造函数引发异常时.发生这种情况时,析构函数会运行.如果您在析构函数中访问尚未初始化的字段,并执行除调用Free之外的任何操作,那么您将获得这样的异常.

  • 这有用吗?在我看来,所有AV都在RTL或其他标准功能中弹出.除非有人也可以访问堆栈跟踪,否则知道发生错误的代码行是不太可能有所帮助的. (2认同)