运行exe时,“exe遇到问题并需要关闭”消息。在Dev机器上运行正常

时间:2011-01-15 10:24:15

标签: delphi

这是在两台运行Windows XP Pro SP3的计算机上发生的,但它在Delphi IDE内外的开发计算机上运行正常。

运行Windows XP专业版。 Exe在Delphi 2010下编译。

当我运行exe时,我收到Windows报告错误“Neopos.exe遇到问题需要关闭。我们很抱歉给您带来不便”

我知道它正在创建主窗体的某个地方发生。

Application.Initialize; //Runs this
Application.CreateForm(TfmMain, fmMain); //FAILS HERE

它没有到达主窗体中的过程TfmMain.FormCreate(Sender: TObject);,我不知道如何追踪此错误并进行调试。

我的主要表单中的Application.CreateForm(TfmUDF, fmUDF);procedure TfmMain.FormCreate(Sender: TObject)之间会发生什么。

如何跟踪此内容以了解导致Windows错误的原因。

当然,Windows错误报告包含很长的信息列表。我在哪里可以查找原因或至少找出错误原因的线索。

此错误现已停止所有开发工作(并破坏了我的周末)所以我迫切需要解决此问题。

6 个答案:

答案 0 :(得分:9)

最直接的方法是在您的应用程序中加入MadExceptJCL Debugger等产品,以获取失败点的完整调用堆栈(包括行号)。几年前我们已经推出了自己的产品,在这样的情况下它已经得到了巨大的帮助。

另一种选择,但更麻烦的是,从项目生成MAP文件,使用MAP2DBG生成.MAP文件,并使用Windows Debbuging Tools获取相同的信息。这种方法是一个很多更多的硬核,如果你真的想学习很多关于windows调试的内部结构(并喜欢使用神秘的工具),这是唯一可取的。

另一种方法是使用Remote Debugging从开发环境附加到失败的应用程序。仅在您对故障机器有相当大的控制权时才适用。

答案 1 :(得分:4)

@ user576639,这里有一些调试思路:

查看系统的事件查看器

如果你有exe has encountered a problem and needs to close的机会,你会在系统的事件查看器中找到它的相关信息。这应该是你的第一步。

是否需要任何特殊的DLL?

  • 你需要MIDAS.DLL吗?
  • 您使用的是数据库引擎吗?它需要某种客户端库吗?

我正在谈论这里的经验:我的开发机器显然拥有我可能需要的所有库。我的大多数客户也拥有大部分库,因为他们安装了我的软件。有时我会推出一些小型帮助应用程序,这些应用程序不会进行大量测试,但它们无法在某些机器上运行,但在其他机器上运行良好。为什么?我使用了TClientDataset,忘了将MIDAS.DLL包含在应用程序中;或者应用程序正在尝试访问Firebird SQL服务器,但用户没有安装Firebird客户端库。

打印机驱动程序问题

男孩我讨厌Delphi的打印机处理。也讨厌有缺陷的打印机驱动程序,还没有决定什么是最糟糕的。如果您的主表单上有某些内容可能正在请求有关默认Windows打印机的信息(例如:一个REPORT),请尝试:安装一个理智/简单的打印机并将其设置为默认打印机。如果用户安装了Office 2007+,请将“Microsoft XPS Document Writer”设置为默认打印机。

已经看到错误的打印机驱动程序+ delphi问题表现为“exe需要关闭”的症状。

准备应用程序的特殊版本

如果您在没有解决问题的情况下做到这一点,那么就应该创建一个能够提供更多信息的应用程序的特殊版本。首先,我尝试将其添加到您的DPR文件中;不知道这对Delphi 2010是否仍然有用,但它确实帮助我看到Delphi 7应用程序的一些早期异常:

function HandleUnhandledException:integer;stdcall;
begin
  Result := 1; // 1 = EXCEPTION_EXECUTE_HANDLER
end;

// and then immediately after "begin" in your DPR file:
begin
  SetUnhandledExceptionFilter(@HandleUnhandledException);
  // ... the usual stuff goes here
end;

将一些ShowMessage -s添加到您的Main Form的代码中,在您的OnCreate处理程序(如果有的话)中,在Create构造函数中(如果有的话)。如果要将ShowMessage添加到Create析构函数中,请确保它在“继承”调用之后。这将有助于确定表单在失败之前的加载程度。

如果一切都失败了......

  1. 创建一个新的空白表单;使其成为新的主表格(因此它在您的前主表格之前初始化)。在客户端的机器上测试它 - 它出现了吗?如果没有,你很可能会遇到一些严重的问题。

  2. 开始将组件从以前的主窗体复制到新的主窗体;只需要复制组件,而不是代码:您的错误可能是由于某些组件未能正确初始化而导致的。确保没有组件具有“Active = True”!小批量复制组件,经常测试。如果您发现导致您的表单无法在客户端计算机上加载的组件,请告诉我们,我们会尽力提供帮助。

  3. 如果您设法在新表单上获得所有组件,请编写一个OnCreate处理程序,为所有需要的组件设置Active:= True。这样可以解决问题吗?

  4. 如果你到目前为止,那么你在主表单上使用的所有组件都可以正确加载。问题与您的代码有关。开始将旧主表单中的所有代码复制到新的主表单中,然后进行小批量测试。您必定会找到导致应用程序停止加载的代码的和平。

答案 2 :(得分:0)

使用dependency walker查看您是否缺少必需的DLL。

答案 3 :(得分:0)

您可以使用错误报告抓取器http://www.maxerist.net/main/soft-for-win/err-rep-grabber)来使用系统报告中的信息(您的错误和建议发送)。当我迫切需要跟踪一个很少出现而几乎不可再现的错误时,我开发了这个工具。它帮助我从堆栈中跟踪信息以找到代码中的实际位置。

该工具仅适用于XP(MS在Win7和Vista中删除了此对话框),但我发现您的案例是XP,所以这可以提供帮助。

更新:如果你不熟悉汇编程序和所有内容,这可以像这样工作。 你应该编译你的程序,不要改变任何东西。将报告保存在错误的计算机上,将文件复制到开发人员计算机并打开以查看内容。查看报告中主线程的堆栈并找到超过$ 00400000的数字,它们通常是调用其他过程并等待返回的过程内的地址。在您的开发人员计算机中,启动程序并在任何行停止,打开CPU窗口并在主列表上使用汇编程序指令右键单击并选择转到地址,输入此地址。您将看到其他汇编程序行,但包含pascal结构,您可以将其识别为您的

答案 4 :(得分:0)

非常感谢你的帮助。

最后,我恢复了最近的备份并将其追溯到特定的形式。 我实际上并没有发现错误,这有点令人担忧,但无论如何我都会回来运行(p !!)

我也在我的开发机器上发生了错误,当时,只有当我使用我的安装程序(Inno Setup)编译setup.exe并安装exe以及安装postgreSQL时。看起来很奇怪,好像设置编译器有问题。无论如何,我没有再看到错误。我想这仍然是一个谜,就像女人一样。

答案 5 :(得分:-2)

在Delphi中使用调试选项选择debug dcu,这将允许您调试TForm及其后代的Delphi源代码,并且您可能能够找到更可能的罪魁祸首。

上设置断点
Application.CreateForm(TfmMain, fmMain); //FAILS HERE

然后单步执行代码以查看问题所在。