在论坛上看到两个关于双核系统下IDE不稳定问题的帖子:
http://bbs.cnpack.org/viewthread.php?tid=3127
http://bbs.cnpack.org/viewthread.php?tid=3115
根据堆栈信息的线索:
[053932EB]{exceptiondiag100.bpl} ExceptionDiagForm.LoadedModules (Line 56, "ExceptionDiagForm.pas" + 18) + $6C
[20ACF536]{coreide100.bpl} StructureView.TBaseStructureViewServices.SyncStructureChanged (Line 299, "StructureView.pas" + 2) + $8
[2000A455]{rtl100.bpl } System.@CheckAutoResult (Line 18047, "sys\system.pas" + 6) + $0
[20ACF536]{coreide100.bpl} StructureView.TBaseStructureViewServices.SyncStructureChanged (Line 299, "StructureView.pas" + 2) + $8
[2003EA79]{rtl100.bpl } Classes.CheckSynchronize (Line 9835, "common\Classes.pas" + 22) + $8
[2016335E]{vcl100.bpl } Forms.TApplication.Idle (Line 8548, "Forms.pas" + 22) + $11
[20162637]{vcl100.bpl } Forms.TApplication.HandleMessage (Line 8124, "Forms.pas" + 1) + $11
[2016291F]{vcl100.bpl } Forms.TApplication.Run (Line 8223, "Forms.pas" + 20) + $3
[0042297A]{bds.exe } bds.bds (Line 195, "" + 7) + $7
我在D2007下跟踪了一下,结果如下:
IDE有一个单独的后台线程用于实时进行代码解析,以支持Structure窗口的结构显示。
异常时堆栈信息显示出错的函数,应该是在编辑代码时,TBaseStructureViewServices.StructureChanged 在后台线程获得变更通知后,用 TThread.Queue 切换到主线程在 Idle 时通过 SyncStructureChanged 再调用 StructureChanged 时出现的异常。怀疑是由于双核系统下在主线程中执行的 StructureChanged 函数和后台的 Parser 线程之间冲突所致。
目前 CW 的助手或结构高亮等功能也是在主线程 Idle 或定时器中来执行调用后台编译器和代码分析等操作,尚不清楚是什么地方与 IDE 原有的功能有冲突,也不排除 IDE 本身有 Bug,被 CW 放大的可能性。
能重现此问题的朋友,请帮助从以下几方面测试一下:
1、当出现异常对话框时,是否每次异常的堆栈信息都与前面的类似?
2、出现异常的时刻,是否每次都是输入字符等待输入助手弹出的瞬间?
3、当禁用输入助手后,是否还会出现故障?
4、当禁用高亮专家后,是否还会出现故障?
注:禁用专家最好是按照置顶调试帖中的方法(启动IDE时按Shift键),彻底禁止专家创建。