Delphi WinXP上的应用程序因未知原因崩溃
我有Delphi XE3,Windows 7 Pro 64位。 我的应用程序在我的电脑上运行良好,但我的用户告诉我,在他们的Win XP和Win 7上启动时,应用程序崩溃 我尝试在Win7上运行该应用程序,但以普通用户身份登录(无管理员)-它可以运行。 所以现在我已经安装了带有WindowsXP的虚拟机,并且真正的应用程序在启动时崩溃了 我需要找出问题所在,但我无能为力 因为我不能使用调试器(我没有在那个虚拟机上安装Delphi), 我尝试放置一些Delphi WinXP上的应用程序因未知原因崩溃,delphi,windows-7,windows-xp,delphi-xe3,Delphi,Windows 7,Windows Xp,Delphi Xe3,我有Delphi XE3,Windows 7 Pro 64位。 我的应用程序在我的电脑上运行良好,但我的用户告诉我,在他们的Win XP和Win 7上启动时,应用程序崩溃 我尝试在Win7上运行该应用程序,但以普通用户身份登录(无管理员)-它可以运行。 所以现在我已经安装了带有WindowsXP的虚拟机,并且真正的应用程序在启动时崩溃了 我需要找出问题所在,但我无能为力 因为我不能使用调试器(我没有在那个虚拟机上安装Delphi), 我尝试放置一些消息框(0,'Hello','Test',MB_
消息框(0,'Hello','Test',MB_OK)
在我的应用程序中的各个位置捕捉它发生的位置,这是我发现的:
我的项目来源中有以下内容:
MessageBox(0, 'Hello', 'Test', MB_OK); // shows OK
Application.CreateForm(TfMain, fMain);
MessageBox(0, 'Hello', 'Test', MB_OK); // doesn't show - crash before this line
这是我的主窗体fMain
的OnCreate
函数:
procedure TfMain.FormCreate(Sender: TObject);
begin
MessageBox(0, 'Hello', 'Test', MB_OK); // doesn't show - crash before this line
...
那么这个应用程序在哪里崩溃呢?甚至连OnCreate中的第一行都没有执行…
我不知道。。。有人吗
不知道这是否重要:我在
接口下的fMainuses
子句中以及实现下都有一些单元。我应该看看那里吗?但是在创建我的主表单之前会发生什么呢?这里有另一种方法可以在虚拟机上不使用Delphi来跟踪这个问题
- 复制你的项目
- 从项目源中删除除主窗体以外的所有单位
- 从XP启动应用程序,看看它是否崩溃
- 如果它崩溃了…那么看看从主窗体中拖入的单元…开始删除它们,直到程序停止崩溃
- 如果它没有崩溃…开始将单元/表单添加回项目源中,直到它崩溃
你是否安装了JCL/JVCL(绝地)
如果是这样,请创建一个记录器…注意,在MainForm代码执行之前,需要创建并连接记录器…您还需要设置未处理异常的详细堆栈跟踪,
在Delphi中选择->项目/选项/链接器/映射文件/详细信息}
您的记录器单元中需要类似的东西
procedure HookGlobalException(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean);
var
a_List: TStringList;
begin
if Assigned(TLogger._Instance) then
begin
a_List := TStringList.Create;
try
a_List.Add(cStar);
a_List.Add(Format('{ Exception - %s }', [Exception(ExceptObj).Message]));
JclLastExceptStackListToStrings(a_List, False, True, True, False);
a_List.Add(cStar);
// save the error with stack log to file
TLogger._Instance.AddError(a_List);
finally
a_List.Free;
end;
end;
end;
initialization
Lock := TCriticalSection.Create;
Include(JclStackTrackingOptions, stTraceAllExceptions);
Include(JclStackTrackingOptions, stRawMode);
// Initialize Exception tracking
JclStartExceptionTracking;
JclAddExceptNotifier(HookGlobalException, npFirstChain);
JclHookExceptions;
finalization
JclUnhookExceptions;
JclStopExceptionTracking;
Lock.Free;
我终于明白了
- 将
打印对话框
组件放在表单上(TPrintDialog)
- 在设计期间,在对象检查器中设置
COPIES=1
(或大于默认零)
- 尝试在未安装打印机的WinXP上运行此类应用程序
应用程序只是在启动时崩溃,在详细信息中,您将只看到一些kernel32.dll地址
我没有在没有打印机的Win7上测试它。我周围没有这样的系统…您无法调试,因为您的虚拟机上没有安装Delphi。“你知道有两种非常简单的方法可以解决这个问题,对吗?”罗伯·肯尼迪,嗯,如果我知道的话,我会这么做。有什么建议吗?我不是罗布,但我的想法是:1)在那个虚拟机上安装Delphi。2) 使用远程调试器(有关详细信息,请参阅Delphi)。至于“在创建OnCreate
之前发生了什么”,请使用源代码。您可以在表单中找到这一点。pas
“应用程序崩溃”不是可接受的错误描述。如果您可以得到实际的错误消息,这可能会导致一个解决方案。从使用中的单位初始化应该无关紧要。它们应该已经在formcreate之前执行。然而。。。在createform调用和formcreate(oncreate)之间,将创建表单上的所有组件。很可能是你的崩溃。你能瘦身/脱掉你的身体直到它不崩溃吗?从剥离特殊的非标准组件开始。(我看到@house of dexter已经提出了这一点。)忘记了需要将此添加到日志记录程序JclDebug,JclHookExcept的使用中