如何在CodeGear Delphi 2007中调试DLL并捕获User32.dll的AV
解决Delphi 2007捕获User32.dll访问违例并获取带Windows符号的堆栈跟踪
一、强制Delphi调试器捕获该访问违例
- 打开Delphi 2007,进入Tools > Debugger Options(调试器选项)。
- 在Language Exceptions标签页:
- 勾选Stop on Delphi Exceptions,点击Add新增
EAccessViolation并设置为Break。
- 勾选Stop on Delphi Exceptions,点击Add新增
- 在OS Exceptions标签页:
- 找到异常代码为
0xC0000005的Access Violation,勾选Break并取消Ignore设置。 - 确保Notify on language exceptions only未被勾选,让调试器响应系统级异常。
- 找到异常代码为
- 辅助代码钩子(调试完成后可移除):
在主程序的initialization段添加全局异常处理,强制触发调试器中断:procedure GlobalExceptionHandler(Sender: TObject; E: Exception); begin DebugBreak; end; initialization Application.OnException := GlobalExceptionHandler;
二、获取并配置Windows符号
- 本地创建符号缓存目录,比如
C:\WinSymbols,用于存放下载的符号文件。 - 配置Delphi调试器符号路径:
- 回到Debugger Options的Symbols标签页。
- 在Symbol Search Path中输入:
该路径会从微软符号服务器下载符号并缓存到本地目录。srv*C:\WinSymbols*https://msdl.microsoft.com/download/symbols - 勾选Load symbols for system modules,确保调试器加载User32.dll等系统模块的符号。
- 验证符号加载:启动调试后,打开View > Debug Windows > Modules,找到
User32.dll,查看状态为“Symbols loaded”即配置成功。
三、获取带Windows符号的堆栈跟踪
- 调试器捕获到AV中断后,打开View > Debug Windows > Call Stack。
- 符号加载正常的话,调用栈会显示User32.dll内的具体函数名及偏移,而非仅内存地址。
- 若部分符号未加载,右键点击调用栈窗口,选择Load Symbols手动触发下载。
内容的提问来源于stack exchange,提问作者Gary Barnes
相关产品推荐
相关产品推荐

