备注:
1.windbg启动进程以后,会自动中断在ntdll!LdrpDoDebuggerBreak函数
2.windbg v7.0~10.0版本是在windows sdk中,需要这个版本需要下载windows sdk,然后安装它。(里面还包含gflags.exe,umdh.exe调试工具,安装完路径:C:\Program Files (x86)\Windows Kits\10\Debuggers\x64)
3.windbg preview版本是目前最新版本,需要通过Microsoft Store应用商店安装,因此需要win10最新版或者win11系统支持才行
调试命令:
1.查看调用堆栈:kn/kv/kp
2.切换到发生异常的线程上下文:.ecxr (有时需要执行这个命令,才能在崩溃线程上看到正常的调用堆栈)
查看具体异常的代码:.exr -1
显示信息如下:
ExceptionAddress:ExceptionAddress: 00007ffd1f951470 (VCRUNTIME140!memcpy+0x180 崩溃发生的位置
ExceptionCode: c0000005 (Access violation) 这是一个访问冲突(内存违规)
ExceptionFlags: 00000000 这是第一次机会异常。如果是 1 则是第二次机会异常
NumberParameters: 2 异常附带参数。对于访问冲突(c0000005),Windows 总是附带 2 个参数(前一个是操作类型,后一个是非法地址)
Parameter[0]: 0000000000000000 0 代表“读操作”(Read)。如果是写操作,这里会是 1
Parameter[1]: 000001a6803c0160 这是导致崩溃的具体内存地址。CPU 尝试去读这个地址,但是失败了
Attempt to read from address 000001a6803c0160 Windbg 帮你翻译好的中文提示:“尝试从地址 000001a6803c0160 读取数据时发生了崩溃”
3.显示所有模块信息及符号加载情况:lm
查看模块的详细符号信息:lm vm <模块名> 如:lm vm VideoPlayerCore (这里不能有后缀名)
如:lm vm VideoPlayer*
检查符号匹配情况:!lmi <模块名>
4.重新加载符号文件:.reload
强制重新加载(即使已加载):.reload /f
重新加载特定模块:.reload /f <模块名> 如:.reload /f MyApp.exe (这里必须加上后缀名)
显示/设置符号路径:.sympath
将某个符号路径加载到已有的符号路径后面:.sympath+ <new path>
设置缓存符号文件路径和微软服务器符号文件路径:.sympath SRV*C:\symbols*https://msdl.microsoft.com/download/symbols
启用符号加载的详细日志:!sym noisy
5