如何使用WinDbg分析转储文件?
4 回答
以下是一些可以帮助您上路的一般步骤:
首先,您必须更改编译器的设置,以便它创建 PDB 文件,即使对于发布版本也是如此。更高版本的Visual C++编译器默认执行此操作,但在许多 Visual C++ 版本中,您必须自己执行此操作。创建程序数据库文件,然后将这些文件与应用程序的每个构建一起保存。至关重要的是,您的应用程序的每个构建都有自己的一组 PDB。例如,您不能只重用您在构建 10 中创建的相同内容来检查构建 15 生成的转储。在您的项目的整个生命周期中,您最终会得到大量的 PDB,因此请为此做好准备。
接下来,您需要能够识别生成转储文件的应用程序的确切版本。如果您正在创建自己的 MiniDump(例如通过调用MiniDumpWriteDump()),最简单的方法可能是简单地将 MiniDump 的文件名的一部分作为应用程序的完整版本号。您需要有一个合理的版本编号方案才能正常工作。在我的商店中,每次自动构建器创建构建时,我们都会将所有分支的构建号加一。
现在您已经从客户那里收到了转储文件,您知道创建转储的应用程序的精确版本,并且您已经找到了此构建的 PDB 文件。
现在您需要查看源代码控制的历史并找到该软件版本的源代码。最好的方法是在每次构建时将“标签”应用于分支。将标签的值设置为准确的版本号,在历史记录中很容易找到。
您几乎准备好启动 WinDbg/Visual C++:
- 获取该版本应用程序的完整源代码树。将其放在硬盘驱动器上的单独位置,例如
c:\app_build_1.0.100
应用程序版本 1.0 build #100。 - 获取应用程序的确切版本的二进制文件并将它们放在硬盘上的某个位置。安装该版本的应用程序以获取二进制文件可能是最简单的。
- 将 PDB 文件放在与步骤 2 中的二进制文件相同的位置。
现在您有两种查看转储文件的选项。您可以使用Visual Studio或 WinDbg。使用 Visual Studio 更容易,但 WinDbg 更强大。大多数情况下,Visual Studio 中的功能就足够了。
要使用 Visual Studio,您只需像打开项目一样打开转储文件。打开后,“运行”转储文件(F5默认情况下),如果所有路径都设置正确,它将带您直接找到崩溃的代码,为您提供调用堆栈等。
要使用 WinDbg,您必须跳过几个环节:
- 启动 WinDbg
- 打开转储文件。( Ctrl+D默认情况下)
- 告诉 WinDbg 去获取正确的 MicroSoft 符号文件。键入
.symfix
。这可能需要一些时间,因为它会从 Internet 上下载大量内容。 - 告诉 WinDbg 符号(PDB 文件)在哪里。键入
.sympath+ c:\pdblocation
,用放置 PDB 文件的位置替换路径名。确保你在那里得到了加号,.sympath
和+
符号之间没有空格,否则你会搞砸第 3 步。 - 告诉 WinDbg 源代码在哪里。键入
.srcpath c:\app_build_1.0.100
替换您从源代码控制获取此版本软件的代码的路径。 - 告诉 WinDbg 分析转储文件。类型
!analyze -v
片刻之后,如果一切配置正确,WinDbg 会直接将您带到崩溃的位置。在这一点上,你有一百万个选项可以深入挖掘应用程序的内存空间、关键部分的状态、窗口等。但这超出了本文的范围。
祝你好运!
(请参阅下面的“转储”部分)
使用WinDbg的基础教程和演示
“启动”/附加 WinDBG 的不同方式
工作区
了解工作区的工作原理...
命令树
“cmdtree”允许您定义调试器命令的“菜单”,以便轻松访问常用命令,而无需记住简洁的命令名称。
您不必将所有命令定义放入同一个 cmdtree 文本文件中......如果您愿意,您可以将它们分开并加载多个(然后它们会获得自己的窗口)。
- 惊人的助手 .cmdtree
- 如何在 WinDBG 中启动时制作 cmdtree 窗口停靠
- 使用 .cmdtree 可以更轻松地在 windbg 中调试 .net 转储
- Microshaoft Cmdtree
- 特殊命令——使用 .cmdtree 从自定义用户界面执行命令
启动脚本
您可以在命令行中使用 -c 选项在启动 WinDBG 时自动运行 WinDBG 脚本。
提供了打开 DML(调试器标记语言)模式、加载特定扩展、设置 .NET 异常断点、设置内核标志的机会(例如,在内核调试时,您可能需要更改 DbgPrint 掩码,以便查看跟踪信息......ed nt !Kd_DEFAULT_Mask 0xffffffff),加载 cmdtrees 等。
一个示例脚本:
$$ Include a directory to search for extensions
$$ (point to a source controlled or UNC common directory so that all developers get access)
.extpath+"c:\svn\DevTools\WinDBG\Extensions"
$$ When debugging a driver written with the Windows Driver Framework/KMDF
$$ load this extension that comes from the WinDDK.
!load C:\WinDDK\7600.16385.1\bin\x86\wdfkd.dll
!wdftmffile C:\WinDDK\7600.16385.1\tools\tracing\i386\wdf01009.tmf
$$ load some extensions
.load msec.dll
.load byakugan.dll
.load odbgext.dll
.load sosex
.load psscor4
$$ Make commands that support DML (Debugger Markup Language) use it
.prefer_dml 1
.dml_start
$$ Show NTSTATUS codes in hex by default
.enable_long_status 1
$$ Set default extension
.setdll psscor4
$$ Show all loaded extensions
.chain /D
$$ Load some command trees
.cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree1.txt
.cmdtree c:\svn\DevTools\WinDBG\cmdtree\cmdtree2.txt
$$ Show some help for the extensions
!wdfkd.help
!psscor4.help
.help /D
命令备忘单
扩展
“扩展”允许您扩展 WinDBG 中支持的命令/功能范围。
- bigLasagne (bldbgexts & blwdbgue)
- 汇编语法高亮和驱动映射工具) - BigLib 数字阅读器
- Byakugan
- 检测反调试方法、vista 堆可视化/仿真、跟踪内存中的缓冲区 - 呼叫流分析器 + KnExt
- CmdHist
- 记录您在调试会话中执行的每个命令,以便您可以轻松地重新执行 - Core Analyzer
- 检查堆结构是否损坏,检测线程共享的对象等 - dom WinDBG 扩展
- (!stlpvector, !idt, !unhex, !grep 等) - dumppe
- 从内存中转储 PE 文件 - 图像查看器扩展 (Vladimir Vukićević)
- Intel UEFI Development Kit Debugger Tool
- 调试 UEFI 固件
- 泄漏陷阱
- GDI/USER 句柄跟踪器,以帮助进行泄漏检测 - Mona(需要 PyKD)
- 帮助高级分析/发现漏洞的一组命令 - MSEC
- 提供自动崩溃分析和安全风险评估 - narly
- 列出有关已加载模块的信息,例如是否使用 SafeSEH、ASLR、DEP、/GS(缓冲区安全检查) - netext (Rodney Viana)
- (!wservice - 列出 WCF 服务对象,!wconfig - 显示 .config 行,!whttp - 列出 HttpContexts,!wselect/!wfrom - 支持类似 SQL 的数组查询) - ODbgExt
- 打开调试器扩展 - OllyMigrate
- 将调试对象传递给另一个调试器而不重新启动 - Psscor2
- SOS 的超集,用于协助调试 .NET 2.0 托管代码 - Psscor4
- SOS 的超集,用于协助调试 .NET 4 托管代码 - PyDBGExt
- 允许使用 python 脚本
- PyKD
- 允许使用 Python 编写 WinDBG 脚本 - sdbgext (Nynaeve)
-(!valloc, !vallocrwx, !heapalloc, !heapfree, !remotecall, !remotecall64, !loaddll, !unloaddll, !close, !killthread, !adjpriv, !ret) - SieExtPub
-legacy 扩展...现在内置于 ext.dll 中的 WinDBG - SOSEX
- 更多帮助调试托管 NET 2.0 或 4.0 代码的命令 - SPT/SDBGExt2 (Steve Niemitz)
- (!DumpHttpContext, !DumpASPNetRequests, !DumpSqlConnectionPools, !DumpThreadPool 等) - Uniqstack
- 调试器扩展的源代码(需要 OSR 在线帐户才能访问它) - viscope
- 代码覆盖率图 - 等待链遍历/wct.dll(Codeplex 调试扩展
- 显示应用程序线程的等待链(帮助查找死锁) - windbgshark
- 集成 Wireshark 协议分析器以启用 VM 流量操作和分析 - WinDBG 扩展 (Sasha Goldstein)
- Tracer、WCT、heap_stat、bkb、traverse_map、traverse_vector) - WinDBG Highlight (ColorWindbg.dll) [使用谷歌翻译翻译链接]
- asm 语法高亮
编写你自己的扩展
使用 WinDBG 调试托管代码
- 打破异常
- 打破特定的 CLR 异常
- 在 Windbg 中调试 .Net 框架源代码
- 使用 Windbg 调试托管代码中的异常
- 使用 WinDbg 和 SOS.dll 调试托管代码
- 使用 WinDbg 进行调试。应用程序中的死锁。
- 使用 WINDBG 进行托管调试。简介与索引
- 在 Windbg 中为启动时崩溃的应用程序设置 .NET 断点
脚本(C#、PS、Python、WinDBG)
- KDAR (Kernel Debugger Anti Rootkit)
- WinDBG 脚本的集合 - Sysnative BSOD 脚本/处理应用程序
- WinDBG 脚本库
- WinDBG 脚本的集合 - 编写 MDbg 和 DbgHostLib 脚本
- 允许托管代码编写托管调试器 (MDBG) 和 DbgEng 脚本 - ExtCS
- 允许通过 C# 脚本控制 WinDBG - PowerDBG
- 允许通过 Powershell 脚本控制 WinDBG
- Pykd
- 允许通过 Python 脚本控制 WinDBG - windbglib
- 围绕 WinDBG 的 pykd 扩展的 python 包装库,模仿 immlib(因此您可以使用最初为 Immunity Debugger 编写的脚本)
使用 dbgeng.dll API/WinDBG 工具的调试器/工具
- 一个简单的基于 Dbgeng 的用户模式调试器
- Acorns.Debugging NET 死锁检测器(使用 cdb.exe)(下载)
- CLR 托管调试器(MDBG)
- DbgHost - 如何控制调试引擎
- 调试诊断工具 v1.2 (DebugDiag), Ver 2.0 + DebugDiag 博客
- Dynamorio - 可以与 WinDBG 交互的动态二进制检测工具
- IDA + WinDBG 插件
- 图形界面 WinDBG
- LeakShell(查找托管泄漏)
- mdbglib - 托管调试 API
- PyDbgEng
- Windows 调试引擎的 python 包装器 - SOSNET - 专注于使用 SOS 扩展并支持 C# 脚本的 WinDBG Fork/替代外壳
- SOSNET O2 fork - 将 Rosyln 用于 C# REPL(读取-评估-打印-循环)脚本引擎的 SOSNET 的分支
- VDB/Vivisect (kenshoto) - 提供基于 WinDBG 的跨平台调试 API
- WinAppDbg + Heappie-WinAppDbg
- 编写一个基本的 Windows 调试器
为事后分析生成故障转储文件的不同方法
- 调试诊断 2.0
- 转储备忘单
- 包括如何从 Hyper-V、VMWare ESX 和 XenServer VM 生成转储。 - 思杰系统转储
- 键盘按键组合
- MiniDumpWriteDump
-(通过应用程序内的 WIN32 API 调用)。(C# 应用程序示例) - NMI Switch,或(此处)
(生成 NMI 的基于硬件的功能......通常在高端服务器上找到,例如HP,或者您可以获得附加 PCI 卡“通用 PCI Dump Switch”)。微软 NMI 技术背景。 - 过程转储
- 系统|高级系统设置|启动和恢复
(注册表信息),
(如何配置完整(完整)内存转储),
(如何启用完整内存转储),
(当 PC 有很多时如何在 Windows 7 上启用完整内存转储内存...通常在超过 2GB 内存时不可用) - 任务管理器“创建转储文件”
- UserDump,说明(非常旧的工具)
- UserModeProcessDumper ,说明
- Visual Studio“将转储另存为...”
- WER(Windows 错误报告....本地转储)
- WinDBG
转储分析工具
- BlueScreenView - 查找在 BSOD 后由 Windows 保存的 minidump .dmp 文件,并提取有关导致崩溃的原因的信息
- Debug.Analyzer(可以分析转储文件,插件可以用.NET编写)
- SAD - 转储后简单(事后分析器)
- Volatility - 用于分析转储文件中记录的“内存”的框架(备忘单)
转储相关工具
- Citrix dumpcheck - 检查转储文件的一致性(看起来它已被放弃链接+链接)
- dumpchk(调试工具的一部分) - 检查转储文件的一致性
- MoonSols Windows Memory Toolkit(以前称为windd) - 将各种原始内存转储文件转换为 WinDBG 兼容的 dmp 文件
- vm2dmp - Microsoft Hyper-V VM 状态到内存转储转换器
- vmss2core - 将 VMWare 快照文件转换为核心转储文件(下载),(说明)
内核调试虚拟机
视频
- .NET 破解 101 #2 - WinDbg 基础知识
- 生产环境的 .NET 调试 (Channel9)
- dotnetConf - 使用 WinDbg 和 SOS 进行高级调试
- David Truxall “使用 WinDBG 进行调试”
- Mike Taulty 调试内存泄漏
- oredev 2009 会议:使用 WinDbg 调试 .NET 应用程序
- Pluralsight 高级 Windows 调试
(以及 Pluralsight 的其他各种调试) - Tess Ferrandez WinDBG (Channel9)
博客
一些博客(本机和托管代码调试的混合)。
- 高级 .NET 调试
- 你所有的基地都属于我们(Sasha Goldshtein)
- 分析-v
- ASP.NET 调试
- Cyberiafreak(线程和高级 Windows 编程和调试)
- 调试分析器.NET
- 调试及超越
- 在线调试专家杂志
- 调试工具箱(Windbg 脚本、调试和故障排除工具和技术,可帮助您隔离软件问题。)
- 解密我的世界
- greggm 的网络日志
- 张俊峰的Windows编程笔记
- 克里斯托弗的花絮
- Mark Russinovich 的博客
- Mike Stalls .NET 调试博客
- 纳文的博客
- 永远不要怀疑你的调试器 (Carlo)
- 黑暗角落的笔记
- Ntdebugging 博客(Microsoft 全球升级服务团队)
- 尼奈芙。Windows 调试和逆向工程历险记
- 现场 PFE 开发人员说明
- Visual Studio 调试器团队
- Volker von Einem 的 WinDbg
高级文章和教程资源
- WinDbg 中的高级调试技术
- MS.Net 和 Windows 的调试应用程序(Powerpoint 幻灯片)
- 使用 WinDbg 调试 STL 容器
- 调试教程 1-7 (CodeProject-Toby Opferman)
- 调试.tv
- 开发者 WinDBG 标记文章
- 傅博士的安全博客 - 恶意软件分析教程 - 逆向工程方法
- 漏洞利用编写教程第 5 部分:调试器模块和插件如何加速基本漏洞利用开发
- 狩猎 Rootkit
- 使用 Dell Windows Debugger Utility (DWDU) 远程调试 Microsoft Windows Server OS 内核(DELL(TM) Windows(R) Debugger Utility 1.1 自述文件)
替代调试器
- Bokken - ( Inguma ) (雷达的 GUI)
- 错误数据库
- Debug++(尚未发布)
- 调试
- 变色环 0 调试器(下载)
- edb (Linux)
- FDBG
- GoBug
- Hades(具有反调试器检测策略的 Ring 3 调试器)
- Hopper(Linux、OSX 和 Windows)(当前未实现 Windows 调试)
- 超数据库
- IDA 调试器
- 免疫调试器
- 纳米石
- 黑曜石(非侵入式调试器)
- OllyDBG
- PE浏览
- RaceVB6(VB6 P 代码调试器)
- 雷达
- radare2ui(雷达的图形用户界面)
- Rasta Ring 0 调试器(RR0D)
- Syser 内核调试器
- TRW 2000(非常旧的调试器,大约 W9x)+ dions 插件存档
- VisualDux 调试器
- Wintruder(可扩展调试器)
- WKTVDebugger(Visual Basic P-Code 的调试器)(下载)
- x64_dbg
- Zeta 调试器
其他链接
- 协作 RCE 工具库
- 大量的调试器和系统级工具 - cr4zyserb
- 大量插件和其他调试工具 - How to Write a Windows Debugger References (Devon Straw)
- 大量链接为您提供了您想要编写自己的调试器所需的详细信息,例如 PDB 文件格式、.DMP 文件格式、PE 文件结构、如何记录堆栈痕迹等等等等。 - Tuts4You
- 解包器、IDA、OllyDBG、Immunity Debugger 插件等。
这是一个非常广泛的问题。
- 第一步是将转储文件加载到 WinDbg 实例中。
- 接下来,您需要确保已设置符号。
- 最后,您可以运行该命令
!analyze -v
以对其执行基本分析。您需要为您的代码提供可用的符号信息,以使转储文件有价值。
内存转储、软件跟踪、调试、恶意软件、受害者软件和情报分析门户网站对我来说非常有用。我也很喜欢这本书, Mario Hewardt 和 Daniel Pravat 的Advanced Windows Debugging。
Tess Ferrandez 有一套很棒的基础教程和实验,可以帮助您开始使用 Windbg。我强烈推荐他们。