如何从已处理/捕获的异常中获取堆栈跟踪并将其转储到跟踪日志

2024-01-08

我们使用 Bob Swart 的白皮书作为指南,创建了一个 Datasnap 服务(使用 Delphi XE)。它运行良好,我们已将其部署到我们的测试服务器上。

现在出现一个问题,当我们执行大量请求(通过 JMeter)时,会发生某种内存损坏。有些请求成功,有些请求因访问冲突而失败。最后,它变得如此腐败,以至于对我们自己的(而不是 DSAdmin)方法的每个请求都会以访问冲突作为响应。

但是,我无法通过堆栈跟踪来获取更多信息,因为在处理请求时已经捕获了异常。

如果我使用该应用程序的 VCL 版本进行大量测试,它仍然可以正常工作。

有谁知道这可能是什么,或者经历过同样的问题,或者你能帮我从捕获的异常中获取堆栈跟踪(在别人的代码中,我无法编辑)?

提前致谢。


要使用 JEDI JCL 记录已捕获和未捕获的异常,您应该安装JEDI JCL http://sourceforge.net/projects/jcl/.

然后尝试一些代码,例如来自以下代码的代码jcl\examples\windows\debug\framestrack\FramesTrackDemoMain.pas:

您应该在 delphi 项目选项的编译器和链接器选项中使用完整的调试信息进行编译,才能正常工作。

请注意,您不必调用 LogException,它会在您添加异常通知程序回调 (JclAddExceptNotifier) 后自动调用。当您添加的表单或数据模块被销毁时,不要忘记调用 JclRemoveExceptNotifier,如下所示:

procedure TForm1.LogException(ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean);
var
  TmpS: string;
  ModInfo: TJclLocationInfo;
  I: Integer;
  ExceptionHandled: Boolean;
  HandlerLocation: Pointer;
  ExceptFrame: TJclExceptFrame;

begin
  TmpS := 'Exception ' + ExceptObj.ClassName;
  if ExceptObj is Exception then
    TmpS := TmpS + ': ' + Exception(ExceptObj).Message;
  if IsOS then
    TmpS := TmpS + ' (OS Exception)';
  mmLog.Lines.Add(TmpS);
  ModInfo := GetLocationInfo(ExceptAddr);
  mmLog.Lines.Add(Format(
    '  Exception occured at $%p (Module "%s", Procedure "%s", Unit "%s", Line %d)',
    [ModInfo.Address,
     ModInfo.UnitName,
     ModInfo.ProcedureName,
     ModInfo.SourceName,
     ModInfo.LineNumber]));
  if stExceptFrame in JclStackTrackingOptions then
  begin
    mmLog.Lines.Add('  Except frame-dump:');
    I := 0;
    ExceptionHandled := False;
    while (chkShowAllFrames.Checked or not ExceptionHandled) and
      (I < JclLastExceptFrameList.Count) do
    begin
      ExceptFrame := JclLastExceptFrameList.Items[I];
      ExceptionHandled := ExceptFrame.HandlerInfo(ExceptObj, HandlerLocation);
      if (ExceptFrame.FrameKind = efkFinally) or
          (ExceptFrame.FrameKind = efkUnknown) or
          not ExceptionHandled then
        HandlerLocation := ExceptFrame.CodeLocation;
      ModInfo := GetLocationInfo(HandlerLocation);
      TmpS := Format(
        '    Frame at $%p (type: %s',
        [ExceptFrame.ExcFrame,
         GetEnumName(TypeInfo(TExceptFrameKind), Ord(ExceptFrame.FrameKind))]);
      if ExceptionHandled then
        TmpS := TmpS + ', handles exception)'
      else
        TmpS := TmpS + ')';
      mmLog.Lines.Add(TmpS);
      if ExceptionHandled then
        mmLog.Lines.Add(Format(
          '      Handler at $%p',
          [HandlerLocation]))
      else
        mmLog.Lines.Add(Format(
          '      Code at $%p',
          [HandlerLocation]));
      mmLog.Lines.Add(Format(
        '      Module "%s", Procedure "%s", Unit "%s", Line %d',
        [ModInfo.UnitName,
         ModInfo.ProcedureName,
         ModInfo.SourceName,
         ModInfo.LineNumber]));
      Inc(I);
    end;
  end;
  mmLog.Lines.Add('');
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  JclAddExceptNotifier(Form1.LogException);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  JclRemoveExceptNotifier(Form1.LogException);
end;

这是通常的初始化代码:

initialization

  JclStackTrackingOptions := JclStackTrackingOptions + [stExceptFrame];
  JclStartExceptionTracking;

这是正在运行的 JCL FramesTrackExample.dproj 演示:

出于您的目的,请更改向 TMemo.Lines 添加行的代码,以写入磁盘上的日志文件。如果您已经有一个日志系统,那就太好了,如果没有,那么请考虑Log4D http://log4delphi.sourceforge.net/.

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

如何从已处理/捕获的异常中获取堆栈跟踪并将其转储到跟踪日志 的相关文章

  • 可以在delphi数据集中创建一个假数据字段吗?

    我想在 DataSet 不是 ClientDataSet 中创建一个 假 数据字段 该字段不应存储在数据库中 它不是计算字段 应允许用户输入输入数据 该字段具有业务逻辑含义 因此用户更新其值后应该更新其他字段 使用 OnFieldChang
  • delphi中生成随机数

    我想在delphi中创建一个随机数并将其分配给文件作为文件名 我设法做到了这一点 但是当我单击按钮生成数字时 它总是以 0 开头 知道如何修复它 procedure TForm1 Button1Click Sender TObject va
  • 如何使用 Delphi Sydney 10.4.2 和 Edge Webbrowser 组件获取 HTML SOURCE

    I have TEdgeBrowser在德尔福 10 4 2 中 我想从 HTML 代码中提取基于 RegEx 的字符串 在过去 这是可能的TWebBrowser 仅适用于 IE 11 或更低版本 作为 selectedEngine 但我的
  • 条件表达式在包内是否被破坏?

    考虑以下片段 requires designide rtl vcl IF RTLVersion lt 19 0 E2026 Constant expression expected IF CompilerVersion 22 0 same
  • FreeMM 与 ShareMem

    我们有很多用 delphi 和 c builder 编写的 dll 库 并使用 sharemem 和 borlndmm dll 3d party 库中的对齐问题迫使我们转向 delphi 2007 中的新内存管理器 有人可以帮我解释一下 共
  • 在 Outlook 中创建带有附件的邮件并显示它

    我想在 Outlook 中创建一封带有附件的邮件并在发送之前显示它 但我想我已经尝试了几乎在网上找到的所有示例 但没有任何运气 我可以使用 Indy 但我非常想使用 Outlook 来确保邮件正确 因为它是用于商业用途 函数的任何输入 该函
  • 调用泛型类型的方法?

    为什么下面的代码在 Delphi XE 中会产生错误 unit UTest interface type TTest class public procedure Foo
  • EIdOSSLUnderlyingCryptoError 和“使用 SSL 连接时出错。错误:14094410...”

    我在 OS X 上的 Delphi 10 1 Berlin 中遇到 Indy 组件问题 我正在使用TIdHTTP使用 HTTPS 连接到 Web 服务 问题是从 OS X 客户端连接到服务器 在 OS X 上运行时 我总是遇到同样的错误 P
  • 如何使用用户输入来寻址 Pascal 中的特定变量(Eval/Exec?)

    我正在尝试在分形程序中做一些非常具体的事情隆起7X http apophysis 7x org 使用的脚本语言是Pascal 该项目是用德尔福写的 https svn code sf net p apophysis7x svn trunk
  • Delphi XE 中的数据绑定向导 - 可以将其配置为映射到 MSXML 接口吗?

    Delphi XE 中的数据绑定向导生成继承自 Delphi 自己的 DOM ADOM XML v4 实现的类和接口 它似乎不支持针对模式进行验证 解析时验证 选项仅适用于 MSXML 供应商type 从 VCL 源代码以及 IDE 中 X
  • Delphi 2007 中的 HelpInsight 文档

    我正在使用 D2007 并尝试使用 HelpInsight 功能 自 D2005 起提供 来记录我的源代码 我主要对让 HelpInsight 工具提示正常工作感兴趣 通过各种网上冲浪和实验 我发现了以下内容 使用三斜杠 注释样式比其他记录
  • 如何读取注册表项的默认值

    我有一个 Delphi XE2 项目来使用注册表项进行某些操作 所以我定义了以下代码 procedure TMainForm BitBtn01Click Sender TObject var RegistryEntry TRegistry
  • 从delphi应用程序调用.net4.0 com服务器后出现错误异常

    我们正在将代码库从 BDS2006 迁移到 Rad Studio XE 我们发现了一些非常奇怪的行为 如果我们在从 Net4 0 中实现的 COM 服务器创建一些对象后进行无效的浮点运算 即除以零 我们不会没有得到正常异常 即 EDivis
  • Delphi XE5 REST/Android 客户端“会话已过期”

    我有一个REST Server与Android Client 都在Deplhi Xe5 Android客户端成功连接Rest服务器 在我的服务器中我有一个TDSHttpWebDispatcher with SessionTimeout 12
  • 如何将数据库查询的行转换为 XML 文件?

    我正在开发一个 Delphi 应用程序 该应用程序需要从一段工作中获取行并将其转换为单个 XML 文件 以便上传到第三方 Web 服务 有没有可用的组件或库可以做到这一点 如果不是 那么构建 DB2XML 转换器的最佳代码方法是什么 我注意
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • Delphi 5 的哈希表实现 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道 Delphi 5 的良好且免费的哈希表实现吗 我需要在哈希表中组织大量数据 并且我有点担心在网
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • 如何使用 Gmail 的 SMTP 和 Indy 10 发送电子邮件?

    我正在使用 Delphi 2009 和 svn 中最新的 Indy 10 通过 SMTP 发送电子邮件 但它不适用于 Gmail Google Apps 托管域 当我尝试发送电子邮件时 我收到 必须首先发出 STARTTLS 命令 我尝试用
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样

随机推荐

  • C++ - 如何隐藏其他应用程序的窗口

    我正在尝试创建一个软件 Qt C 其中我需要一种根据窗口标题隐藏其他应用程序窗口的功能 隐藏意味着不可见而不是最小化 任何人都可以说出如何实现这一目标吗 我目前正在Windows平台上工作 注意 如果您通过 Qt 提供解决方案 将会更加舒适
  • 在多边形内部随机放置一个多边形

    我有两个多边形定义为一系列 2D 浮点值 不保证它们是凹的或凸的 他们不会超越自己 他们不能旋转 如果可能的话 我想将一个随机放置在另一个内部 主要问题是效率 我必须在几秒钟内执行大约 200 次左右 我已经研究这个问题几天了 但没有取得明
  • 为什么页面错误通常由操作系统而不是硬件处理?

    我发现在TLB丢失过程中 有些体系结构使用硬件来处理它 而有些体系结构则使用操作系统 但当涉及到页面错误时 大多数都使用操作系统而不是硬件 我试图找到答案 但没有找到任何文章解释原因 有人可以帮忙解决这个问题吗 谢谢 如果硬件能够自行处理它
  • 为什么 0.1 + 0.1 == 0.2?

    这是关于Java的 据我了解 由于二进制表示形式 Java 无法完美表示 0 1 这使得 0 1 0 1 0 1 0 3 错误的 然而 为什么 0 1 0 1 0 2 给出真实的 由于二进制表示形式 0 1 无法用 Java 完美表示 这使
  • createStackNavigator 不是一个函数

    我正在构建我的第一个练习应用程序 并尝试使用 createApp Navigator 组合屏幕之间的导航 但是 一旦我尝试使用createAppNavigator我收到以下错误 相关代码 App js import React from r
  • 向下滚动时,recyclerview 内的嵌套滚动视图不会触发 onscrolllistener

    Edit 我已经从 Web 服务加载了 200 多个数据集 当我向下滚动 recyclerview 时 它不会触发滚动侦听器 因为 如果我不使用 dy gt 0 条件 它会加载所有接下来的 20 个数据 20 个数据等等 最初是在进行此活动
  • 同一网页内的小程序之间如何共享数据?

    我在同一个网页中有几个小程序 我想在它们之间共享数据 做到这一点的最佳解决方案是什么 EDIT 感谢您的回复 我会尝试更具体 我的网页上有 3 个小程序 第一个将从网络服务器下载文件 第二个将用于本地修改文件 第三个会将修改后的文件发送回服
  • C# 3.0 中的命名/可选参数?

    有没有办法像 C 4 0 一样向 C 3 0 添加可选参数 我一定要拥有这个功能 我已经等不及了 Edit 如果您知道实现此目的的解决方法 技巧 也请发布它 谢谢 您可以使用匿名类型和反射作为命名参数的解决方法 public void Fo
  • 使用 UTF8 格式化 MySQL 命令行

    我有一个包含瑞典 挪威字符串的数据库表 当我查询一些数据时 我得到如下输出 输出与set names latin1 name Kid Interi Bwg Homes If Skadef kring Jangaard Export Nord
  • 尝试在 %AppData% 中执行 .exe 时访问被拒绝

    我正在尝试使用RemoveDrive exe 在这里找到 http www uwe sieber de drivetools e html 在我的 Java 应用程序中 我的 JAR 中有它 我使用以下代码将其提取到临时文件中 但是当我尝试
  • 更改 html5 视频标签的源

    我正在尝试构建一个可以在任何地方使用的视频播放器 到目前为止我会选择
  • 从张量中获取值的随机索引

    我有一个包含一些数值的张量张量 0 0 0 1 1 1 1 2 1 0 1 0 对于每个张量 我想获得零值的随机索引 所以对于第一个张量 可能的输出值为0 1 2对于第二个张量 可能的值为3 5 我只想从这些可能的结果中随机选择一个 所以像
  • 将变量传递给分页库类

    我正在使用 Android 分页库创建一个应用程序 我正在使用它的改造 改造代码位于 ItemDataSource 中 我无法将变量传递给它 我有一些有意的变量 我如何在 Retrofit Post 方法中设置变量 项目数据源 public
  • 如何解决Azure WebJob中无法获取单例锁的问题?

    当我在本地运行应用程序时 我无法获取单例锁问题 我该如何解决 下面是我的代码 static void Main JobHostConfiguration config new enter code here JobHostConfigura
  • SQL:查询包含一组确切用户的组

    如果我有一个简单的用户和组的多对多联接表 例如 CREATE TABLE IF NOT EXISTS users id int 6 unsigned NOT NULL name varchar 16 NOT NULL PRIMARY KEY
  • 使用 C# 在 Excel/VSTO 中的列号到列字母

    如何查找列的名称或标题 例如 如果我在 Excel 中选择第 5 列 则意味着我希望结果为 E 如何获取与列号对应的字母或字母 请帮我解决代码 public static string GetColumnName int columnNum
  • 使用 javascript 在单选按钮列表上调用 onclick

    如何使用 JavaScript 调用单选按钮列表上的 onclick 您如何生成单选按钮列表 如果您只使用 HTML
  • 使用 ThreadPool.QueueUserWorkItem 对线程进行排序

    我是线程基础知识的新手 我有一个要对 XML 文件执行的操作队列 节点添加 节点删除等 1 有 n 个xml文件 并且对于每个文件 使用线程池中的线程分配 ThreadPool QueueUserWorkItem 来执行这些文件操作 我想使
  • 如何通过先浏览将文本文件中的内容或html文件中的html代码加载到文本区域?

    使用 javascript 如何从网页打开文本文件或 html 文件并将文本文件或 html 代码中的内容加载到文本区域 请不要告诉我这不可能使用 javsscript 这是可能的 但我不知道代码 而且我的兄弟一周都没有回家 示例代码将不胜
  • 如何从已处理/捕获的异常中获取堆栈跟踪并将其转储到跟踪日志

    我们使用 Bob Swart 的白皮书作为指南 创建了一个 Datasnap 服务 使用 Delphi XE 它运行良好 我们已将其部署到我们的测试服务器上 现在出现一个问题 当我们执行大量请求 通过 JMeter 时 会发生某种内存损坏