windbg coredump奔溃追踪
2019-12-28 14:00 youxin 阅读(1440) 评论(0) 编辑 收藏 举报Windbg简单来说就是一个Windows下对用户态/内核态的程序进行调试,以及对Core Dump文件的分析。对于Crash,资源泄露,死锁等问题的分析,Windbg是一个强有力的利器。
生成Dump文件方式
1.1任务管理器
在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程。右键—>创建转储文件
此时会在默认的目录下创建出一个dump文件。
可以看出,此种方法只适用于程序崩溃但没有立即自行退出的情况。倘若程序故障后自行退出,则此方法就难以应用。不过,我们可以在注册表中添加如下信息已确保系统在程序崩溃后自行保存一个dump文件:
在注册表中找到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsError Reporting\LocalDumps
添加项如下图:
其中DumpType代表的含义是:
0 = Create a custom dump
1 = Mini dump
2 = Full dump
如此一来,一旦程序崩溃,系统会在C:\CrashDump下生成一个dump文件。
1.2WinDbg抓取
程序运行崩溃后,先不关闭程序,将WinDbg附加到改进程上。
执行命令:.dump –ma Test.dmp ,则会产生一个Test.dmp的转储文件。
程序中加入存储Dump的代码
通过SetUnhandledExceptionFilter设置捕获dump的入口,然后通过MiniDumpWriteDump生成dump文件。
如下程序在程序异常时会自行转储一个名为Test.dmp的dump文件。
https://blog.csdn.net/libaineu2004/article/details/81169061
一、下载
微软官网提供的Windbg为windows10版本,win7下不能使用。Win7下使用Windbg需要通过Windows SDK下载,下载链接为//www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b&displaylang=en
安装
如果对windows SDK的其他内容不感兴趣,可只勾选Windbg.
————————————————
开始使用Windbg
微软官网提供了详细的使用教程,参考链接:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windows-debugging
在使用之前,需要完成以下任务
判断哪个设备作为服务系统,那个设备作为客户系统。调试器运行在客户系统,程序运行在服务系统。
判断你将要进行用户态调试还是内核态调试。内核态可以拥有极大的权限,可以访问系统的任何部分,许多核心操作系统功能和硬件驱动运行在内核态。用户态拥有很多限制,只能运行在自己的虚拟内存空间,不能直接访问系统。
关于调试内核态,请参考:
关于调试用户态,请参考:Getting Started with WinDbg (User-Mode).
除此之外,还需要做以下事情:
配置符号表。为了使用WinDbg提供的所有高级功能,必须加载正确的符号表。可以参考:Symbols for Windows debugging (WinDbg, KD, CDB, NTSD)。Windows 调试中的符号表
配置源码。如果你的目标是调试你自己的源代码,你需要配置源码路径。
————————————————
https://blog.csdn.net/luchengtao11/article/details/82379374
找不到符号文件
抓取完Dump后,打开WinDbg,Ctrl+D找到刚才抓取的Dump文件,报如下异常:
*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll -
使用Windows符号表服务器
为了方便调试,需要获取Windows系统DLL的符号表文件。微软公司提供了可以通过Internet访问的符号表服务器。
经过设置,在调试过程中,windbg调试器会从符号表服务器自动下载调试所需的PDB文件,非常方便。
设置方法: 在 【Symbol Search Path】 对话框中加入下面的路径:srv*D:\SystemSymbols*http://msdl.microsoft.com/download/symbols
其中: D:\SystemSymbols为存放符号的下载目录
意:
win32程序在64位操作系统上,需要生成dump时,应该生成32位的dump,否则windbg在获取call stack时可能出错,一些sos、psscor2等扩展无法读取dump中的数据,一些命令在获取dump中的信息也会受限。
对于32位dump,应该用x86版的windbg分析(无论是在32位还是64位操作系统上);64位dump,应该用在64位操作系统上使用x64版的windbg进行分析。
分析Dump文件
使用菜单【Open Crash Dump】打开Dump文件,然后打开堆栈观察窗口,此时看到的堆栈可能不是异常发生时的堆栈。
通过如下命令切换到异常发生时的堆栈:
.ecxr
为了分析异常,可以通过下面的语句来获取分析信息,帮助定位问题:
!analyze -v
常用命令:
输入
kv
命令以获得实际的异常的调用堆栈:
https://www.cnblogs.com/kekec/archive/2012/11/14/2755924.html
https://blog.51cto.com/11512826/2068421
https://www.cnblogs.com/kekec/archive/2012/11/14/2755924.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2015-12-28 redis error MISCONF Redis is configured to save RDB snapshots