对DELPHI的一些END后的出错,大家是怎么调试的?(50分)

  • 主题发起人 主题发起人 吴剑明
  • 开始时间 开始时间

吴剑明

Unregistered / Unconfirmed
GUEST, unregistred user!
写了个过程,过程执行正常,结束后,就是跳出END后,就报错,说是EOSError。
不知道该怎么调试了。虽说有CPU窗口看,那也只能看,什么也不能干。:(

对DELPHI越来越失望了。
 
EOSError一般是指系统模块文件错误,无效的句柄或者Stream传输末端异常等等原因都可能引发。
用过DXSock with D6没有???倒~~ 这个该死的破东西,运行时好好的,一结束就弹出这种错误。
 
设置断点。
按F7或者F8执行看看。
 
都在END后了,还设什么断点?
 
出现这种问题,当然只能看源码了。
在认为出错的地方,单步执行,一行一行地看。
 
你再检查一下你的源程序,看看是否有begin和end不匹配的情况.
我想一般end出问题应该是end的个数有问题!
 
你查一下所use的所有单元的 finalization section
 
这个问题我也遇到过,三层的client,关闭程序老是出错!
断点也没有用,看CPU窗口看了半天,终于看到一个socket的字样
彻底检查才知道是socketconnent关闭的时候忘了断开,搞死了
 
我也遇到过这样的问题,总之是由于一些非常规操作造成的。我一般调试这样的问题
是先返回到没出问题时的情况,逐渐加代码,到出现问题时,再来想办法调整程序。
 
是别的地方出错的。
源码拿来看吧
 
用halt来关闭程序,什么错误也“没有”!
 
END出错的原因是清除堆栈中的局部变量出错。
这种容易出错的变量都是DELPHI自维护的类型,最主要的是STRING
而发生这样的原因最主要又是因为数据被破坏
打个比方:
procedure testerror;
type pFloat=^Real;
Var A:Integer;
B:String;
begin
B:='123';
pFloat(@A)^:=10101;
end;
等到你执行到END以后就出错了,原因是释放B出错,因为B的地址已经被覆盖了。
当然一般来说我们是不会如此低级错误,但是在使用其他的时候就未必了:
打个比方:
procedure testerror;
type pFloat=^Real;
Var A:Array[0..1023] of integer;
B:String;
i:Integer;
begin
B:='123';
for i:=0 to length(A) do //Maybe somebody wrote as for i:=1 to length(A)
begin
A:=i;
end;
end;
象这种访问数组越界的少-1的事情是经常发生的笔误,这同样会引发END后出错。
同样的错误还可能容易发生在:
Socket.recvbuf(Buf,Count)
打个比方
procedure testerror;
type pFloat=^Real;
Var A:String;
B:String;
begin
B:='123';
setlength(A,Socket.RecvLength);
Socket.RecvBuf(A,Socket.RecvLength)

end;
这样也会发生这样的错误,也许YB_U...遇到的问题就是如此,
我们往往忘记写成Socket.RecvBuf(A[1],Socket.RecvLength),结果B的位置又被覆盖了

还有一种情况也会导致这样的错误,那就是DLL之间使用了STRING类型而且未有使用SHAREMEM,
这个情况我相信大家都已经很清楚了,就不多说了。

千万别“对DELPHI越来越失望了”,DELPHI确实不是一个完美的东西,尽管我也有时候
对DELPHI编译上的一些怪异的处理比较失望,但是倘若你真正掌握了它,把其当成一个
不错的OBJECT PASCAL编译器还是很不错的,我确实对学C++很厌恶,好在还有一个DELPHI。
 
是不是没释放内存?
 
接受答案了.
 
虽然你已经接收了

可是,为什么,为什么b的地址被覆盖了,我还不明白

 
后退
顶部