如果查找内存覆盖的错误?(100分)

  • 主题发起人 主题发起人 zhjwjan
  • 开始时间 开始时间
Z

zhjwjan

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序有一个全局的对象,程序起来是创建这个对象,中间没有任何地方释放和修改这个
对象。程序开始时正常,运行一段时间后,某些地方访问这个对象出现访问异常,估计是
程序的某个地方操作不慎,把这个变量的值覆盖了。我的程序比较大,很难查,请问用什么
方法可以确定是哪个地方覆盖了这个变量的值?
 
你用 Search -> FindInFiles 查找所有对这个全局变量赋值的地方。
仔细分析一下就可以找到bug.
 
我的程序中没有任何地方对这个对象进行赋值,这个对象创建了就是只读的。
 
声明在哪里?怎么创建的哪(owner 是谁)?
 
看一下使用缓冲区或者临时以及全局变量时
是否使用了超出原来定义的存储范围,
譬如,定义了一个临时变量的缓冲区,一个100字节的数组,
但是写数据的时候,可能写了超过100的数据
 
to xeen:
声明很简单:var criticalsection: TCriticalsection;
创建:criticalsection:=TCriticalsection.create;
使用:
criticalsection.enter;
try
...
finally
criticalsection.leave;
end;

to lichaohui:
很可能是类似这种操作造成的,但我的程序实在太大了,这样一行行看过去,很费时间,也不
一定把它找出来。能不能有别的办法可以确定问题所在呢?
 
虽然程序多,但是出错的时候正在执行的代码,基本上是可以确定的
先分析一下这些代码吧
 
还有如果创建全局对象,应该指定对象的拥有者是Application 或者 nil
否则,当他的拥有者被释放时,他也同时被释放了,
访问已经不存在的对象,当然会出现异常
 
如果实在查不出来直接用API算了 :
InitializeCriticalSection
EnterCriticalSection
LeaveCriticalSection
DeleteCriticalSection
 
to lichaohui:
我自己的代码好查,我还用到一个控件,叫做asta的,有源代码,但是代码非常多,我查了几
遍自己的代码,看不到有哪些地方进行非法操作,或者我没查仔细。如果问题不在我自己的
代码,而在那个控件,那就更难查了,怎么办啊?

to xeen:
你这个办法可能可以避免criticalsection不被覆盖,但其它的变量就会被覆盖了,以后又
会出现莫名奇妙的错误。我觉得不找出根源来,始终不是办法。
 
后退
顶部