You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中raise at ExceptAddr在x64调试器中失效问题咨询

Delphi x64调试器中raise at <address>未正确定位异常源头的问题分析

问题场景

使用Delphi的raise at <address>特性调试时,期望让调试器定位到重新抛出异常的原源头,该功能在32位环境下正常工作,但x64调试器始终会在异常重新抛出的代码行处中断,而非原异常抛出点。

最小复现代码:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

begin
  try
    raise Exception.Create('Test'); // 预期调试器在此行中断
  except
    var E := AcquireExceptionObject;
    raise E at ExceptAddr; // x64环境下,调试器实际在此行中断
  end;
end.

测试环境:Delphi 10.4、Delphi 11

问题分析

  1. 用法正确性:你没有误解raise at的用法。raise E at ExceptAddr的设计目标就是将异常的调用栈上下文重置为ExceptAddr指向的原异常抛出位置,让调试器在原异常行触发中断,而非重新抛出的代码行。
  2. 行为差异原因:这是Delphi x64调试器的已知bug,并非设置问题。即使调试器使用默认配置(比如未添加额外异常断点、设置为“仅在未处理异常时中断”),x64环境下依然会出现这个行为偏差,而32位调试器能正确识别raise at指定的异常源头。

临时解决方案

  • 手动查看异常的调用栈:当调试器在重新抛出的行中断时,打开调用栈窗口,直接定位到最底层的原异常抛出点。
  • 切换到32位环境调试:如果场景允许,在32位编译模式下调试相关逻辑,调试器会正确在原异常行中断。

内容的提问来源于stack exchange,提问作者EF1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:45:49