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

如何在CodeGear Delphi 2007中调试DLL并捕获User32.dll的AV

解决Delphi 2007捕获User32.dll访问违例并获取带Windows符号的堆栈跟踪

一、强制Delphi调试器捕获该访问违例

  1. 打开Delphi 2007,进入Tools > Debugger Options(调试器选项)。
  2. 在Language Exceptions标签页:
    • 勾选Stop on Delphi Exceptions,点击Add新增EAccessViolation并设置为Break。
  3. 在OS Exceptions标签页:
    • 找到异常代码为0xC0000005的Access Violation,勾选Break并取消Ignore设置。
    • 确保Notify on language exceptions only未被勾选,让调试器响应系统级异常。
  4. 辅助代码钩子(调试完成后可移除):
    在主程序的initialization段添加全局异常处理,强制触发调试器中断:
    procedure GlobalExceptionHandler(Sender: TObject; E: Exception);
    begin
      DebugBreak;
    end;
    
    initialization
      Application.OnException := GlobalExceptionHandler;
    

二、获取并配置Windows符号

  1. 本地创建符号缓存目录,比如C:\WinSymbols,用于存放下载的符号文件。
  2. 配置Delphi调试器符号路径:
    • 回到Debugger Options的Symbols标签页。
    • 在Symbol Search Path中输入:
      srv*C:\WinSymbols*https://msdl.microsoft.com/download/symbols
      
      该路径会从微软符号服务器下载符号并缓存到本地目录。
    • 勾选Load symbols for system modules,确保调试器加载User32.dll等系统模块的符号。
  3. 验证符号加载:启动调试后,打开View > Debug Windows > Modules,找到User32.dll,查看状态为“Symbols loaded”即配置成功。

三、获取带Windows符号的堆栈跟踪

  1. 调试器捕获到AV中断后,打开View > Debug Windows > Call Stack。
  2. 符号加载正常的话,调用栈会显示User32.dll内的具体函数名及偏移,而非仅内存地址。
  3. 若部分符号未加载,右键点击调用栈窗口,选择Load Symbols手动触发下载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:02:58