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

Win64 Delphi汇编无法捕获异常的原因及规则咨询

问题原因

核心原因是Delphi的异常处理依赖结构化异常处理(SEH)的帧元数据:

  • 编译器自动生成的Delphi汇编代码中,会隐式插入SEH相关的帧信息(比如Delphi的TRYFRAME伪指令对应的结构,或者符合Win64 SEH标准的异常处理链数据),这些数据是系统识别异常处理范围、展开调用栈的关键。
  • 你手动复制的汇编只保留了业务逻辑(比如除零的运算代码),完全缺失了这些异常处理的元数据,导致当异常触发时,系统无法找到对应的try-except处理块,最终因无法展开异常而崩溃。
官方文档说明

Embarcadero官方的《Delphi Win64 Compiler Guide》中专门有章节讲解Win64汇编的编写规范,其中明确提到了异常处理相关的要求,包括SEH帧的设置、栈帧的维护规则等。

Win64 Delphi汇编异常处理遵循规则

要让Delphi正确处理运行时错误,手动编写Win64汇编时必须遵守以下规则:

  • 必须显式设置异常处理帧:使用Delphi提供的TRYFRAME和ENDTRYFRAME伪指令标记异常处理的范围,让编译器生成对应的SEH元数据;如果手动编写原生Win64汇编,需要符合微软Win64 SEH的结构要求,在栈中正确设置异常处理记录。
  • 严格遵循Win64调用约定:
    • 前四个参数使用RCX、RDX、R8、R9寄存器传递,剩余参数压栈;
    • 栈必须保持16字节对齐,调用函数前要确保栈指针是16的倍数;
    • 保留RBX、RBP、RSI、RDI、RSP、R12-R15这些非易失性寄存器的值,异常展开时需要这些寄存器来恢复栈状态。
  • 正确维护栈帧:必须使用PUSH RBP + MOV RBP, RSP建立栈帧,异常展开时依赖RBP来遍历调用栈,找到对应的异常处理块。
  • 不要破坏异常处理相关的寄存器:RBP作为帧指针必须全程保持有效,不能随意修改后不恢复,否则栈回溯会失败。
  • 显式声明过程的异常属性:如果汇编过程可能抛出异常,需要在过程声明时使用{$EXTERNALSYM}配合正确的异常标识,或者确保汇编代码中的异常触发点能被Delphi的SEH机制识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:05:05