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
问题分析
- 用法正确性:你没有误解
raise at的用法。raise E at ExceptAddr的设计目标就是将异常的调用栈上下文重置为ExceptAddr指向的原异常抛出位置,让调试器在原异常行触发中断,而非重新抛出的代码行。 - 行为差异原因:这是Delphi x64调试器的已知bug,并非设置问题。即使调试器使用默认配置(比如未添加额外异常断点、设置为“仅在未处理异常时中断”),x64环境下依然会出现这个行为偏差,而32位调试器能正确识别
raise at指定的异常源头。
临时解决方案
- 手动查看异常的调用栈:当调试器在重新抛出的行中断时,打开调用栈窗口,直接定位到最底层的原异常抛出点。
- 切换到32位环境调试:如果场景允许,在32位编译模式下调试相关逻辑,调试器会正确在原异常行中断。
内容的提问来源于stack exchange,提问作者EF1
相关产品推荐
相关产品推荐

