代码之家  ›  专栏  ›  技术社区  ›  Harriv

如何调试Delphi应用程序中挂起的主线程

  •  2
  • Harriv  · 技术社区  · 16 年前

    我已经在Delphi2007中编写了应用程序,它有时会挂起(甚至不是每周,应用程序都是全天候运行的)。看起来主线卡住了。找出这个问题的原因有哪些选择?

    应用程序是用Delphi2007编写的,它使用了remobjects、dbexpress和firebird、opc通信和com。

    2 回复  |  直到 13 年前
        1
  •  11
  •   mghie    16 年前

    使用madexcept,您可以指定定期检查主线程,使其仍能处理消息(使用变量超时,您可以将其设置为比最长操作要高的值)。如果主线程挂起,则可以获得堆栈跟踪。

    Main thread freeze checking...

    我已经成功地使用了它,它只有在挂在驱动程序中时才会失败(这可能是意料之中的)。在开始怀疑驱动程序(对于A/D转换卡)之后,我在每次API调用之前和之后添加了跟踪消息,并且能够证明驱动程序是罪魁祸首。请注意,为了获得可靠的日志数据,必须立即将消息写入文件并刷新缓冲区。

    我也成功地使用了 WinDbg 在没有安装Delphi的系统上附加挂起的可执行文件。结果证明,这是一个死锁,因为不总是以相同的顺序获取关键部分。windbg通过检查线程堆栈和关键部分的状态来帮助分析这种情况。

        2
  •  4
  •   Ian Boyd    13 年前

    为此,我使用了一个“看门狗”线程,它检查主窗体是否响应,并进行小型转储(可以使用windbg加载此转储,使用map2dbg.exe将delphi.map转换为.dbg)。

    FMainformHandle := Application.MainForm.Handle;
    Result := SendMessageTimeOut( FMainformHandle, WM_NULL, 0, 0,
          SMTO_NORMAL or SMTO_ABORTIFHUNG,
          C_TIME_OUT_SECONDS * 1000, //wait 1minute
          iRes) <> 0;
    if not Result then
    begin
       hFile := CreateFile(PChar(Result), GENERIC_WRITE, FILE_SHARE_WRITE, nil,
             CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
       try
          MiniDumpWriteDump(GetCurrentProcess, GetCurrentProcessId, hFile,
                aDumpType, nil, nil ,nil);
       finally
          FileClose(hfile);
       end;
    end;
    

    但你也可以用

    JCdBuff.Pas:
    jclCreateThreadStackTraceFromID(维护ID)

    为此(不需要windbg等,只需要jcl+delphi.map)

    第三种选择是使用我的新 sampling profiler 它有一个“进程堆栈查看器”,因此您可以查看正在运行的进程的任何线程的堆栈(我以前为此使用过SysInternals进程浏览器,但它需要.dbg文件)。它使用.map、td32、jdbg等(任何delphi调试信息)进行堆栈跟踪。
    您可以在应用程序挂起时使用这个来调查堆栈。

    Windows API(用于MiniDumpWriteDump):
    http://sourceforge.net/projects/jedi-apilib/files/JEDI%20Windows%20API/
    WinDbg:
    http://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx
    MAP2dBG:
    http://code.google.com/p/map2dbg/
    绝地JCL:
    http://jcl.delphi-jedi.org/
    asmprofiler,samling模式:(仍在开发中!)
    http://asmprofiler.googlecode.com/files/AsmSamplingProfiler0.4.zip