Delphi 服务应用程序随机崩溃

2024-01-08

我有一个德尔福服务应用程序。 Indy TCP 服务器和许多客户端(最多 50 个)、到 Firebird 的 ADO 连接和简单的网络交换。应用程序在下一个事件(例如)中随机崩溃(可能在 7 天后工作,可能是 1 小时):

文件: rollcontrol.exe, 文件: 1.1.20.2, 文件: 0x60acd5f2 文件名: ntdll.dll, 文件名: 6.3.9600.19678, 文件名: 0x5e82c0f7 错误信息: 0xc0000005 错误信息:0x00058def Идентификатор сбойного процесса: 0x4178

or:

版本: rollcontrol.exe, 版本: 1.1.1.9, 版本: 0x607b239c 文件名: msvcrt.dll,地址:7.0.9600.16384,地址:0x52158ff5 错误信息: 0xc0000005 错误信息:0x00009e80

应用程序中的所有作业都在 anonimius 线程或 tcp/ip 连接线程中进行。每个线程中的所有代码都在 try except 语句中执行。没有内存泄漏或线程数增加。服务线程的主要代码很简单:

procedure TRollControl_Svc.ServiceExecute(Sender: TService);
begin

  while not Terminated do
  try
    ServiceThread.ProcessRequests(False);
    ServiceThread.Sleep(100);
  except
    on e : exception do LogException('ServiceExecute', E);
  end;

end;

我如何处理此异常并防止应用程序崩溃?如何用两行简单的代码使服务线程崩溃?

Thanks

UPDATE:数据库连接示例:

function TRollControl_Svc.GetNodeIdByIP(ip: string): integer;
Var
    SQLConnection : TADOConnection;
    SQLQuery : TADOQuery;
    Thread : TThread;
    fResult : integer;
begin

    fResult := 0;

    try
      Thread := nil;
      Thread := TThread.CreateAnonymousThread(
      procedure
      begin

        try

          SQLConnection := nil;
          SQLQuery := nil;

          CoInitialize(nil);

          SQLConnection := TADOConnection.Create(nil);
          SQLConnection.ConnectionString := 'Provider=MSDASQL.1;Password=' + Psw + ';Persist Security Info=True;User ID=' + Usr + ';Data Source=' + Srv ;
          SQLConnection.LoginPrompt := false;

          SQLQuery := TADOQuery.Create(nil);
          SQLQuery.Connection := SQLConnection;
          SQLQuery.LockType := ltReadOnly;

          try SQLConnection.Open; except SQLConnection.Open; end;
          SQLConnection.BeginTrans;

          SQLQuery.Close;
          SQLQuery.SQL.Text := 'select nodes.* from nodes where nodes.ip = :ip';
          SQLQuery.Parameters.ParamByName('ip').Value := ip;
          try SQLQuery.Open; except SQLQuery.Open; end;

          if SQLQuery.IsEmpty then exit;

          fResult := SQLQuery.FieldByName('ID').AsInteger;

          if SQLConnection.InTransaction then
            SQLConnection.CommitTrans;

        finally

          TryFree(SQLQuery);
          TryFree(SQLConnection);

          CoUninitialize;
        end;

      end
      );
      Thread.FreeOnTerminate := false;
      Thread.Start;
      Thread.WaitFor;
    finally
      TryFree(Thread);
    end;

    result := fResult;

end;

错误处理

这不是导致您的问题的答案,但我认为评论中可能不清楚。

在支持结构化异常处理的语言中,当事情不起作用时,该语言为程序员提供了优雅地失败的机会。这不是你使用它的方式。从您的示例匿名线程中您可以得到:

  try SQLConnection.Open; except SQLConnection.Open; end;

因此,您被告知无法建立连接,并且您没有对这种情况做出响应,而是继续尝试再次连接。连接无法工作的原因有很多,其中一些是暂时的,因此尝试可能会稍后才能工作,但如果您只是在没有任何暂停的情况下再次尝试,那么预计它会再次失败似乎是合理的。

捕获错误显然很重要,但您必须有适当的故障路径。

我无法知道这是否与实际出现的问题有关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi 服务应用程序随机崩溃 的相关文章

  • 从 BLE 设备同步读取多个特征(Android 推荐方法)

    我正在开发一个从 BLE 设备读取数据的 Android 应用程序 我在这里遇到了很多关于如何读取多个特征的解决方案 其中大多数都建议使用队列 我确实实现了 Queue 方法 并且我的代码中的一切都按预期正常工作 我开始这个帖子的原因是为了
  • 如何读取和更改 TEdit 控件的值?

    我有一个表格TForm1有 5TEdit and 2 TBitBtn 我还需要该程序 以便在输入数字数据后Edit1 and Edit2 on BitBtn1Click Edit1 and Edit2值将被求和并显示在Edit3 你想做这样
  • iOS崩溃核心位置CFBasicHashCreateCopy?

    我已经通过 Crashlytics 报告了这个问题 尽管我无法在本地复制它 所以除了下面的堆栈跟踪之外我没有什么可做的 不确定堆栈跟踪中是否引用了 CoreLocation与它有任何关系 但我不确定可能是什么原因 我的项目使用的是ARC 有
  • 从 Visual Studio 2015 Update 1 中的生成后事件执行 AL.EXE 时出现错误 -1073741819 (0xC0000005)

    使用 Visual Studio 2015 Update 1 在生成后事件中运行命令 AL EXE 时 我正在 Visual C CLR 类库项目 C CLI 中试验一个问题 Visual Studio 2015 中没有发生 AL EXE
  • Delphi:现场记录应用程序错误

    使用 Delphi 7 我想知道是否有一个免费组件可以在我的应用程序在远程站点运行时收集诊断信息并帮助我调试错误报告 也许它会记录每个选择的菜单项 单击的控件 文本输入等 也许它只是在崩溃时转储堆栈 也许它还有其他作用 我不介意添加代码 例
  • 对于大型简单数据库,SQLite 和 DISQLite 有何比较?

    两者有什么区别SQLite http www sqlite org and DISQLite http www yunqa de delphi doku php products sqlite3 index为什么我要选择其中一个而不是另一个
  • (发件人:TObject)

    发件人 TObject 是什么意思 如 procedure TForm1 Button1Click Sender TObject var s Integer begin end Sender 是对触发事件的组件的引用 在这种情况下 Send
  • 更改 TFS 构建代理的身份

    我们有一个运行集成测试的 TFS 构建代理 其中一些测试会调用 Internet 上的 Web 服务 我们的网络使用代理与互联网通信 由于构建代理在网络服务上的身份下运行 并且网络服务的设置未配置为使用代理 因此测试失败 我该如何执行以下操
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 应用内购买导致偶尔崩溃

    我在互联网上搜索了这方面的帮助 但没有结果 我的应用程序已在应用程序商店中上线 少数用户报告应用程序在进行应用内购买后冻结并崩溃 我的游戏中唯一的 IAP 它基本上解锁了完整版本 即使他们重新启动设备并尝试继续 设备也会再次崩溃 我无法重现
  • Android蓝牙权限问题

    首先 抱歉我的英语不好 我是西班牙人 并且是 Android 开发的新手 我正在开发一个简单的蓝牙文件发送器 我基于BluetoothChat android示例一步一步 现在我向用户发出蓝牙激活请求 并选择是或否选项应用程序崩溃 我拥有清
  • 新编译的应用程序需要 UAC/elevation?

    我有一个系统 我将其设置为普通的 UAC 并在我的 delphi 环境中编译名为 ka exe 的项目 并为其创建一个 installshield 项目 设置完毕 一切顺利 但每当我开始我的程序时 它都需要提升 而我不知道为什么 为了确保
  • IntelliJ IDEA 中的 Android 开发导致电脑死机

    我使用 IntelliJ IDEA 10 5 进行 Android 开发 并使用最新的 Google USB 驱动程序 版本 4 进行调试 在 IntelliJ IDEA 中开发一段时间后 当通过 USB 连接 Android 设备 Nex
  • 如何将IDL导入到Delphi中?

    我如何导入接口定义语言 idl 文件存入Delphi 将类型和接口转换为 pascal 文件 我试过了 File Open 它只显示 idl 文本文件的文本 Project 添加到项目 它只是 就像 添加了一个 idl文本文件到项目 成分
  • Delphi 是否在构造对象之前分配变量?

    Delphi 是否在对象完全构造之前分配实例变量 换句话说 给定一个变量 var customer TCustomer nil 然后我们构造一个客户并将其分配给变量 customer TCustomer Create 有没有可能custom
  • 如何检查文件是否有备用数据流?

    Delphi 有没有办法检查文件是否有任何备用数据流 看一下 Win32 APIFindFirstStreamW https msdn microsoft com en us library windows desktop aa364424
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • 在 XMLDocument 中使用 DocumentElement 时发生访问冲突

    当我尝试使用时 我总是遇到访问冲突DocumentElement of the XMLDocument 我创造XMLDocument基于某些文件的存在 错误信息 项目project1 exe引发异常类EAccessViolation 消息
  • 需要帮助编写循环任务调度程序

    我需要编写一个工具 它将按照用户可配置的时间表运行重复任务 我将用 C 3 5 编写它 它将在 XP Windows 7 或 Windows Server 2008 上运行 完成任务大约需要 20 分钟 用户可能想要设置多种配置 例如每日
  • 在该对象调用的事件期间销毁该对象

    我有一个按钮 它的 OnClick 事件调用一个销毁按钮的过程 但随后 线程 想要返回到 OnClick 事件 并且我遇到了访问冲突 我完全被难住了 您需要在按钮的所有代码执行完毕后销毁该按钮 执行此操作的标准方法是将用户定义的消息发布到表

随机推荐