Delphi WinXP上的应用程序因未知原因崩溃

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_

我有Delphi XE3,Windows 7 Pro 64位。 我的应用程序在我的电脑上运行良好,但我的用户告诉我,在他们的Win XP和Win 7上启动时,应用程序崩溃

我尝试在Win7上运行该应用程序,但以普通用户身份登录(无管理员)-它可以运行。 所以现在我已经安装了带有WindowsXP的虚拟机,并且真正的应用程序在启动时崩溃了

我需要找出问题所在,但我无能为力

因为我不能使用调试器(我没有在那个虚拟机上安装Delphi), 我尝试放置一些
消息框(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中的第一行都没有执行…
我不知道。。。有人吗


不知道这是否重要:我在
接口下的fMain
uses
子句中以及
实现下都有一些单元。我应该看看那里吗?但是在创建我的主表单之前会发生什么呢?

这里有另一种方法可以在虚拟机上不使用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的使用中