Board logo

Subject: 每日构建为什么是空的 :( delphi经常会无报错退出 [Print This Page]

Author: felixsun    Time: 2004-11-30 14:54     Subject: 每日构建为什么是空的 :( delphi经常会无报错退出

在delphi 6下, delphi经常会无报错退出,

  估计是输入助手的问题

  规律:
   每次都是在敲几个字母后要出现助手对话框的时候,
   关闭 输入助手 后没有这个问题

  幸亏我有 Ctrl + S 的习惯 :D
Author: zjy    Time: 2004-11-30 15:48

每日构建刚才正在做目录调整,现在可以在这里下载:
http://www.cnvcl.org/downbuilds.php

D6下助手导致无报错退出是严重的问题,请查看这个帖子来查错:
http://bbs.cnvcl.org/viewthread.php?tid=291
如果有空,请下载一个调试版帮助我们改正。
Author: felixsun    Time: 2004-11-30 21:36

进行了一些测试, 初步估计是,语法分析器的问题,

在特定的工程下,故障重现率100%
工程的特点是,包含了很多单元,注释掉部分单元后,故障消失,取消注释后重现,
只要注释掉部分单元就可以,不需要特定的单元,

我猜测是,搜到的关键字太多,语法分析器的存储被溢出了   仅仅是猜测
Author: felixsun    Time: 2004-11-30 21:40

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ScktComp, inifiles, TypeUnit, StdCtrls, ExtCtrls, Grids, Menus, ComCtrls,
  ActnList, winsock2, te_controls, ksthemeforms, ksthemeengine,
  ksthememenus, ksthemegrids, ksthemetabs, ksthemeedits, ksthemelabels,
  ksthemebuttons, ksthemepanels, ksthemeitems, ksthemespinedit, ShellAPI,
  jpeg, ksthemetrackbars, ksthemestatusbar, ksthemestdcontrol, GFrame,
  ksthemecheckboxs, ImgList, ksthemecomboboxs, SimpleTCP,
  ksthememessages, Global, syncobjs, ksthemegroupboxs;

implementation

uses LogInUnit, AnswerRecordMeetListUnit, AnswerOrRecordUnit,
  NotificationUnit, TodayMeetListUnit, SendNotificationUnit,
  SetMeetUnit, MeetMemberUnit, UIUnit, Video, FullVideo, HandleMemUnit,
  HandleBuffUnit, UnitCtrl, ChooseServerUnit, ChangeInforUnit,
  RcvTextUnit, ChatUnit, PresideWindows, SpeedkerWindows, MyVideoWindows,
  SendProgress, MeetMsgListUnit, ChooseFileUnit, TurnForm,
  SetSoundUnit, FileSendClientUnit, UnitWDMVFWCap, RForm, typinfo,
  StartClinicUnit;
Author: zjy    Time: 2004-11-30 22:06

OH,这个工程真大啊!如果确实是标识符太多的问题话,用调试版专家应该可以查到这个问题,有空下载一下测试一下吧。
http://www.cnvcl.org/download/debug/CnWizards_0.7.0.8_Debug.exe
Author: felixsun    Time: 2004-11-30 23:01

已经跟踪到这里,应该是这一段出的问题
单元 CnWizSymbolList

[Copy to clipboard]
CODE:
for i := 0 to SymbolCount - 1 do
begin
// Get the name of the symbol.
CompGetSymbolText(Symbols^[i], S, 2);

if Filter <> '' then
Idx := Pos(Filter, UpperCase(S))
else
Idx := 1;
if (Idx = 1) or MatchAnyWhere and (Idx > 0) then
begin
// Get the declear of the symbol.
CompGetSymbolText(Symbols^[i], Text, 1);
IconIndex := GetIconIndex(Text);
if IconIndex <> siUnknown then
begin
Idx := AnsiPos(S, Text);
if Idx > 0 then
Text := Trim(Copy(Text, Idx + Length(S), MaxInt));
end;
// 某些声明会带 (...) 的无意义符号
Text := StringReplace(Text, '(...)', '', [rfReplaceAll]);
Add(S, IconIndex, Round(MaxInt / SymbolCount * i), Text);
end;
end;


Author: felixsun    Time: 2004-11-30 23:08

应该是这句,当i太大的时候,
                CompGetSymbolText(Symbols^[i], Text, 1);
Author: felixsun    Time: 2004-11-30 23:34

出错时 SymbolCount 远远大于 i ,
GetMemory 也都没有失败
Author: zjy    Time: 2004-12-1 08:13

请问出错时 SymbolCount 大约有多少?你的 D6 打过 SP2 了吗?
我找个大工程测试一下看看。
Author: zjy    Time: 2004-12-1 08:50

我刚才在 D6SP2 下把几乎所有系统自带单元都加进去,SymbolCount 达到 46,666,也没有出错啊。
Author: felixsun    Time: 2004-12-1 11:04

忘记说了,出错时, I只有 1044  
我在
CompGetSymbolText(Symbols^, Text, 1);
前后都加了 OutputDebugString
确定,只到了这句的前面
Author: zjy    Time: 2004-12-1 11:32

在源码的不同位置弹出输入助手时,显示的列表项也不同的,比如在:
var
  i: In
这里弹出时列表中包含的都是类型和常量列表,而在方法体中列表又不同,这个是 IDE 内部处理的,你发生错误时是在什么位置呢?还是不管在哪都出错?

另外,能不能查查在第一次调用:
CompGetSymbolText(Symbols^[i], S, 2); // 这句返回的是标识符
时,返回的 S 是什么?
CompGetSymbolText(Symbols^[i], Text, 1); // 这句返回的是声明
是这一句出错吧。

如果有问题,可能得跟踪 IDE 的汇编了,可惜我这里不能重现。

另外,在使用助手出错的环境下,使用 IDE 自己的自动完成是否也会出错呢?
Author: felixsun    Time: 2004-12-1 17:35

函数里
Var
  a:Tv

类似的
Author: zjy    Time: 2004-12-6 13:41

在这个位置时符号确实是比较多的,那使用 IDE 自己的自动完成是否也会出错呢?




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0