【问题标题】:Diagnose app crashing on startup in specific machines?在特定机器上诊断应用程序在启动时崩溃?
【发布时间】:2020-06-01 11:28:50
【问题描述】:

最近我从 Delphi 2007 升级到 10.3.3 。使用 10.3.3 编译的同一个应用程序会在启动时崩溃,但仅在某些机器上;在我的环境中,我无法模拟这个问题,但我的一些客户遇到了这个问题。如果我在 D2007 中编译相同的应用程序,则不会发生错误,因此我认为与新的 Delphi 版本有关。

错误消息如下所示,之后,应用程序将关闭。该消息过于笼统,我该怎么做才能至少尝试确定导致崩溃的原因?

这是我尝试过的:在我的应用程序的主窗体中,我进入了 FormCreate 事件并在第一行放置了 showmessage('stop');,但之前发生了崩溃这个。

我知道这是一个很难回答的问题,但我正在寻求建议以至少朝某个方向看,所以请帮忙!

提前致谢。

更新:这是 Eureka 日志跟踪:

【问题讨论】:

  • 嗯,读取地址 00000000 意味着它正在尝试从零指针读取。
  • 如果崩溃发生在你的主窗体创建之前,那么它很可能发生在某个单元的initialization 部分,这是@$$ 跟踪和调试的痛苦。
  • 我会选择 madExcept。它将帮助您确定异常的确切位置。
  • 您需要一个堆栈跟踪,MadExcept 或 Eurekalog 应该对您的情况有所帮助
  • @delphirules:如果您无法在系统上重现它;总有可能做remote debugging

标签: delphi delphi-10.3-rio


【解决方案1】:

安装 EurekaLog 后,我发现问题与 Datasnap 有关。这是我解决问题的方法,希望对某人有所帮助。

midas.dll 库已经存在于应用程序的同一文件夹中。然后我将 midas.dll 复制到 c:\windows\syswow64 并以管理员权限在提示符下运行以下命令:

c:\windows\syswow64\regsvr32 midas.dll

之后应用运行良好。

有人可以解释为什么需要这样做吗?

【讨论】:

  • DSIntf 单元的启动代码包含一个函数 CheckDBClient,该函数使用对系统注册表的调用来读取 Midas.Lib 的假定所在位置。
  • FWIW,只要它与可执行文件位于同一目录中,我们就不必注册它。就我个人而言,我非常反对应用程序将此类内容转储到系统文件夹中的做法。
  • @JerryDodge,是的,我也不喜欢它,但这是解决问题的方法。从现在开始,我将尝试使用 Midaslib
  • @JerryDodge:嗯,我不确定为什么 OP 认为有必要将 Midas.Lib 复制到 SysWow64 文件夹(除了通常的大锤来破解核桃的原因) - 他本可以离开它在它所在的位置,并以提供给 RegSvr32 的名称指定了它的路径。
  • @MartynA 总的来说,我的意思是我从来不需要使用regsvr32。我们只是将它保存在我们的可执行目录中以便自动找到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 2018-08-02
  • 2016-09-02
相关资源
最近更新 更多