应用程序崩溃原因不明在WinXP上

时间:2013-08-08 21:00:15

标签: delphi windows-7 windows-xp delphi-xe3

我有Delphi XE3,Windows 7 Pro 64bit。 我的应用程序在我的电脑上工作正常但是我的用户告诉我应用程序在Win XP上启动时崩溃,并且在他们的Win 7上也是(!!)。

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

我需要找到可能存在的问题,但我很无奈。

据我无法使用调试器(我没有安装该虚拟机上的Delphi), 我尝试在我的应用程序的不同位置放置一些MessageBox(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

这是我的主要表单的OnCreate函数,名为fMain

procedure TfMain.FormCreate(Sender: TObject);
begin
  MessageBox(0, 'Hello', 'Test', MB_OK); // doesn't show - crash before this line
  ...

那么这个应用程序可以在哪里崩溃? OnCreate中的第一行甚至没有执行.... 我不知道......有人吗?

不知道这是否重要:我在uses下的interface条款中以及implementation下都有一些单位。我应该看看吗?但是在我的主要形式OnCreate之前发生了什么?

2 个答案:

答案 0 :(得分:1)

最后我明白了!

  • 在表单上放置PRINT DIALOG组件(TPrintDialog)
  • 在设计时间内在对象检查器中设置COPIES = 1(或大于默认值零)
  • 尝试在没有安装PRINTERS的WinXP上运行此类应用程序

应用程序在启动时崩溃,在细节中你只会看到一些kernel32.dll地址...

我没有在没有打印机的Win 7上测试它。我周围没有这样的系统......

答案 1 :(得分:0)

这是另一种在虚拟机上没有Delphi的情况下跟踪此问题的方法......

  • 复制您的项目。
  • 从主要表单中删除项目来源中的所有单位。
  • 从XP启动您的应用程序,看它是否崩溃。

  • 如果它崩溃了......那么请查看从主窗体中拖入的单元...开始删除它们直到程序停止崩溃。

  • 如果它没有崩溃...开始将单位/表格添加回项目源,直到它崩溃。

您是否安装了JCL / JVCL(JEDI)?

如果是这样的话,创建一个Logger ...注意在MainForm代码执行之前需要创建和挂钩Logger ...你还需要从Unhandled Exceptions设置详细的Stack Trace,  在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;