如何使用WinDbg来分析VC ++应用程序的崩溃转储?
如何使用WinDbg分析转储文件?
以下是一些通用的步骤,可以帮助您:
首先,您必须更改编译器的设置,以便创buildPDB文件,即使是发布版本也是如此。 Visual C ++编译器的更高版本在默认情况下执行此操作,但是在许多版本的Visual C ++中,您必须自己执行此操作。 创build程序数据库文件,然后保存这些文件的存档以及应用程序的每个版本。 每个构build的应用程序都有自己的一组PDB是至关重要的。 例如,您不能重复使用与构build10相同的构件来检查构build15生成的转储。 在你的项目的整个生命周期中,你将会得到大量的PDB,所以要做好准备。
接下来,您需要能够确定生成转储文件的应用程序的确切版本。 如果你正在创build自己的MiniDump(例如通过调用MiniDumpWriteDump() ),最简单的方法是简单地将MiniDump的文件名称作为应用程序的完整版本号。 您需要有一个合理的版本编号scheme才能运行。 在我的商店中,每当自动构build器创build构build时,我们都会将所有分支的内部版本号增加一个。
现在您已经收到来自客户的转储文件,您知道创build转储的应用程序的准确版本,并且已经find了此版本的PDB文件。
现在,您需要查看源代码pipe理的历史logging,并find该软件的确切版本的源代码。 做到这一点的最好方法是每次构build时将“标签”应用于分支。 将标签的值设置为确切的版本号,在历史logging中很容易find。
你几乎可以开始WinDbg / Visual C ++的开发了:
- 获取该版本的应用程序的完整源代码树。 把它放在你硬盘上的一个单独的地方,比如
c:\app_build_1.0.100
,应用程序版本1.0 build#100。 - 获取应用程序的确切版本的二进制文件,并将其放在硬盘驱动器的某个位置。 简单地说,安装该版本的应用程序来获取二进制文件可能是最简单的。
- 在步骤2中将PDB文件放在与二进制文件相同的位置。
现在有两个选项可以查看转储文件。 您可以使用Visual Studio或WinDbg。 使用Visual Studio更容易,但WinDbgfunction更强大。 大多数情况下,Visual Studio中的function就足够了。
要使用Visual Studio,您只需打开转储文件就好像它是一个项目一样。 一旦打开,“运行”转储文件(默认为F5 ),如果所有的path设置正确,它会带你到崩溃的代码,给你一个调用堆栈等。
要使用WinDbg,你必须跳过几个箍:
- 启动WinDbg
- 打开转储文件。 (默认情况下为Ctrl + D )
- 告诉WinDbg去获取正确的MicroSoft符号文件。 键入
.symfix
。 这可能需要一些时间,因为它会从互联网上下载大量的东西。 - 告诉WinDbg符号(PDB文件)在哪里。 键入
.sympath+ c:\pdblocation
,代替将PDB文件放在path名中的任何位置。 确保你在那里得到加号,在.sympath
和+
符号之间没有空格,否则你会搞砸第3步。 - 告诉WinDbg源代码在哪里。 键入
.srcpath c:\app_build_1.0.100
replace此版本的软件从源代码pipe理中获取代码的path。 - 告诉WinDbg分析转储文件。 键入
!analyze -v
过了一会儿,如果一切正确configuration,WinDbg会带你到你的崩溃的位置。 在这一点上,你有100万个选项来深入挖掘你的应用程序的内存空间,关键部分的状态,窗口等。但这超出了本文的范围。
祝你好运!
(请参阅下面的“转储”部分)
使用WinDbg的基本教程和演示
- 安装和configurationWinDbg(Windowsdebugging工具)
- Mike Taulty – WinDBG的一个词
- WinDbg教程
- Windowsdebugging器:第1部分:WinDbg教程
不同的方法来“启动”/附加WinDBG
- 用Windbg开始debugging(包括如何debugging.msi)
- 如何debuggingWindows服务
- 设置Windowsdebugging
工作区
了解工作空间如何工作…
- debugging你的debugging器:为windbgdebugging创build一个自定义工作区
- 在WinDbg中查找工作区如何工作
Cmdtree
“cmdtree”允许您定义debugging器命令的“菜单”,以便轻松访问常用的命令,而无需记住简洁的命令名称。
你不必把所有的命令定义放到同一个cmdtree文本文件中….如果你愿意的话,你可以把它们分开,并加载多个命令(然后他们得到自己的窗口)。
- 惊人的帮手.cmdtree
- 如何在WinDBG启动时创buildcmdtree窗口
- 使用.cmdtree更容易debugging.net转储在windbg中
- Microshaoft Cmdtree
- 使用.cmdtree自定义用户界面中的特殊命令执行命令
启动脚本
您可以在命令行上使用-c选项在启动WinDBG时自动运行WinDBG脚本。
给出机会打开DML(debugging器标记语言)模式,加载特定的扩展,设置.NETexception断点,设置内核标志(例如,当内核debugging时,您可能需要更改DbgPrint掩码,以便看到跟踪信息…编辑器!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
命令作弊表
- 崩溃转储分析海报v3.0
- SOS Cheat Sheet(.NET 2.0 / 3.0 / 3.5)
- WinDbg备忘单(Dev of Art)
- WinDbg内核模式扩展命令抽认卡
扩展
“扩展”允许您扩展WinDBG内部支持的命令/function的范围。
- bigLasagne(bldbgexts&blwdbgue)
– 汇编语法突出显示和驱动程序映射工具) - BigLib数字阅读器
- 的Byakugan
– 检测antidebugging方法,vista堆可视化/仿真,在内存中跟踪缓冲区 - 呼叫stream量分析器+ KnExt
- CmdHist
– logging您在debugging会话中执行的每个命令,以便轻松地重新执行 - 核心分析器
– 检查堆结构的腐败,检测线程共享的对象等 - dom WinDBG扩展
– (!stlpvector,!idt,!unhex,!grep等) - dumppe
– 从内存转储PE文件 - 图像查看器扩展(VladimirVukićević)
- 英特尔®UEFI开发套件debugging工具
– debuggingUEFI固件 - leaktrap
– GDI / USER处理跟踪器以帮助检漏 - Mona (需要PyKD)
– 一组命令来帮助进行高级分析/查找攻击 - MSEC
– 提供自动碰撞分析和安全风险评估 - narly
– 列出加载模块的信息,如使用SafeSEH,ASLR,DEP,/ GS(缓冲区安全检查) - netext (罗德尼维亚纳)
– (!wservice – 列出WCF服务对象,!wconfig – 显示.config行,!whttp – 列表HttpContexts,!wselect /!wfrom – 支持SQL查询数组) - ODbgExt
– 打开debugging器扩展 - OllyMigrate
– 将debugging对象传递给另一个debugging器而不重新启动 - Psscor2
– 帮助debugging.NET 2.0托pipe代码的SOS超集 - Psscor4
– 帮助debugging.NET 4托pipe代码的SOS超集 - PyDBGExt
– 允许使用python脚本 - PyKD
– 允许Python用于脚本WinDBG - sdbgext(Nynaeve)
– (!valloc,!vallocrwx,!heapalloc,!heapfree,!remotecall,!remotecall64,!loaddll,!unloaddll,!close,!killthread,!adjpriv,!ret) - SieExtPub
扩展名…现在内置于ext.dll中的WinDBG中 - SOSEX
– 更多的命令帮助debugging托pipeNET 2.0或4.0代码 - SPT / SDBGExt2(Steve Niemitz)
– (!DumpHttpContext,!DumpASPNetRequests,!DumpSqlConnectionPools,!DumpThreadPool等) - Uniqstack
– 源到debugging器扩展(需要OSR在线帐户来访问它) - viscope
– 代码覆盖图 - 等待链式遍历/ wct.dll(Codeplexdebugging扩展
– 显示应用程序线程的等待链(帮助find死锁 ) - windbgshark
– 集成了Wireshark协议分析器来启用虚拟机stream量操作和分析 - WinDBG扩展(Sasha Goldstein)
– Tracer,WCT,heap_stat,bkb,traverse_map,traverse_vector) - WinDBG突出显示 (ColorWindbg.dll)[使用Google Translate to link]
– 语法突出显示
写下你自己的扩展
- 交易工具:第四部分 – 开发WinDbg扩展DLL
- debugging器扩展的基础:短期的努力,长期的收益
使用WinDBGdebugging托pipe代码
- 打破例外
- 打破特定的CLR例外
- debuggingWindbg中的.Net框架源代码
- 使用Windbgdebugging托pipe代码中的exception
- 使用WinDbg和SOS.dlldebugging托pipe代码
- 用WinDbg进行debugging。 应用程序中的死锁
- 用WINDBGpipe理debugging。 介绍和索引
- 在Windbg中为在启动时崩溃的应用程序设置.NET断点
脚本(C#,PS,Python,WinDBG)
- KDAR(内核debugging器防Rootkit)
– 一个WinDBG脚本的集合 - 系统BSOD脚本/处理应用程序
- WinDBG脚本库
– 一个WinDBG脚本的集合 - 脚本MDbg和DbgHostLib
– 允许托pipe代码脚本托pipedebugging器(MDBG)和DbgEng - ExtCS
– 允许通过C#脚本控制WinDBG - PowerDBG
– 允许通过Powershell脚本控制WinDBG - Pykd
– 允许通过Python脚本控制WinDBG - windbglib
– 围绕用于WinDBG的pykd扩展的python包装库,模仿immlib(所以你可以使用原本为Immunity Debugger编写的脚本)
使用dbgeng.dll API / WinDBG工具的debugging器/工具
- 一个简单的基于Dbgeng的用户模式debugging器
- Acorns.Debugging NET死锁检测器 (使用cdb.exe)( 下载 )
- CLR托pipedebugging器 (MDBG)
- DbgHost – 如何控制一个debugging引擎
- debugging诊断工具v1.2 (DebugDiag), 版本2.0 + DebugDiag博客
- Dynamorio – 可以与WinDBG交互的dynamic二进制检测工具
- IDA + WinDBG插件
- GUI WinDBG
- LeakShell (findpipe理泄漏)
- mdbglib – 托pipedebuggingAPI
- PyDbgEng
– Windowsdebugging引擎的python包装 - SOSNET – 一个专注于使用SOS扩展并支持C#脚本的WinDBG Fork / alternative shell
- SOSNET O2 fork – 使用Rosyln进行C#REPL(read-eval-print-loop)脚本引擎的SOSNET分支
- VDB / Vivisect (kenshoto) – 在WinDBG上提供了一个跨平台的debuggingAPI
- WinAppDbg + Heappie-WinAppDbg
- 编写一个基本的Windowsdebugging器
不同的方法来生成崩溃转储文件进行事后分析
- DebugDiag 2.0
- 转储备忘录
– 包括如何从Hyper-V,VMWare ESX和XenServer VM生成转储。 - Citrix SystemDump
- 键盘按键组合
- MiniDumpWriteDump
– (通过您的应用程序中的WIN32 API调用)。 (C#应用程序示例) - NMI开关 ,或(在这里)
(基于硬件的function来生成NMI …通常在高端服务器(例如HP)上find,或者您可以获得附加PCI卡“通用PCI转储开关” )。 微软NMI技术背景 。 - Procdump
- 系统|高级系统设置|启动和恢复
( registry信息 ),
( 如何configuration完整(完整)内存转储 ),
( 如何启用完整内存转储 ),
( 当PC有大量内存时,如何在Windows 7上启用完整内存转储…当内存超过2GB时通常不可用 ) - 任务pipe理器“创build转储文件”
- UserDump , 说明 (很老的工具)
- UserModeProcessDumper , 说明
- Visual Studio“Save Dump As …”
- WER(Windows错误报告….本地转储)
- WinDBG的
转储分析工具
- BlueScreenView – 在BSOD之后find由Windows保存的小型转储.dmp文件,并提取有关导致崩溃的信息
- Debug.Analyzer (可以分析转储文件和插件可以用.NET编写)
- SAD – 转储后简单 (事后分析)
- 波动性 – 分析转储文件中logging的“内存”的框架( 备忘单 )
转储相关的工具
- Citrix dumpcheck – 检查转储文件的一致性(看起来像是被遗弃的链接 + 链接 )
- dumpchk (debugging工具的一部分) – 检查转储文件的一致性
- MoonSols Windows内存工具包 (以前称为windd ) – 将各种原始内存转储文件转换为兼容WinDBG的dmp文件
- vm2dmp – Microsoft Hyper-V VM状态到内存转储
- vmss2core – 将VMWare快照文件转换为核心转储文件( 下载 ),( 说明 )
内核debugging虚拟机
- VMKD – 虚拟机KD扩展
- VirtualKD – (在VMWare / VirtualBox中托pipe的操作系统的内核debugging器支持)
影片
- .NET Cracking 101#2 – WinDbg基础知识
- 用于生产环境的.NETdebugging(Channel9)
- dotnetConf – 使用WinDbg和SOS进行高级debugging
- David Truxall“使用WinDBG进行debugging”
- Mike Taultydebugging内存泄漏
- oredev 2009会话:用WinDbgdebugging.NET应用程序
- Pluralsight高级Windowsdebugging
(加上Pluralsight的其他各种) - 苔丝Ferrandez WinDBG(Channel9)
博客
一些博客(本地和托pipe代码混合debugging)。
- 高级.NETdebugging
- 你所有的基地都属于我们 (Sasha Goldshtein)
- 分析-V
- ASP.NETdebugging
- Cyberiafreak (线程和高级的Windows编程和debugging)
- debugging分析器.NET
- debugging和超越
- 在线debugging专家杂志
- debugging工具箱 (Windbg脚本,debugging和故障排除工具和技术,以帮助您隔离软件问题。)
- 解密我的世界
- greggm的WebLog
- 张俊峰的Windows编程笔记
- 克里斯托弗的花絮
- Mark Russinovich的博客
- Mike Stalls .NETdebugging博客
- Naveen的博客
- 永远不要怀疑你的debugging器(卡罗)
- 从黑暗的angular落注意到
- Ntdebugging博客 (Microsoft Global Escalation Services团队)
- Nynaeve。 Windows中的冒险debugging和逆向工程
- PFE开发者注意事项
- Visual Studiodebugging器团队
- Winkerb通过Volker von Einem
高级文章和教程资源
- WinDbg中的高级debugging技术
- 为MS.Net和Windowsdebugging应用程序(Powerpoint幻灯片)
- 使用WinDbgdebuggingSTL容器
- debugging教程1-7(CodeProject-Toby Opferman)
- Debugging.tv
- 开发者WinDBG已标记文章
- 傅博士的安全博客 – 恶意软件分析教程 – 逆向工程方法
- 利用写作教程第5部分:debugging器模块和插件如何加速基本开发的发展
- 狩猎Rootkit
- 使用Dell Windowsdebugging器实用程序(DWDU)进行远程Microsoft Windows服务器操作系统内核debugging ( DELL(TM)Windows(R)Debugger Utility 1.1自述文件 )
替代debugging器
- Bokken – ( Inguma )(radare的GUI)
- BugDbg
- debugging++ (尚未发布)
- Debuggy
- 变色环0debugging器 ( 下载 )
- edb (Linux)
- FDBG
- GoBug
- 阴影(Ring 3debugging器,反debugging器检测策略)
- Hopper (Linux,OSX和Windows)(Windowsdebugging目前没有实现)
- Hyperdbg
- IDAdebugging器
- ImmunityDebugger
- Nanomite
- 黑曜石(非侵入式debugging器)
- OllyDbg的
- PEBrowse
- RaceVB6 (VB6 P-Codedebugging器)
- radare
- radare2ui (用于radare的GUI)
- Rasta Ring 0debugging器 (RR0D)
- Syser内核debugging器
- TRW 2000 (非常古老的debugging器大约W9x)+ dions插件归档
- VisualDuxdebugging器
- Wintruder (可扩展debugging器)
- WKTVDebugger (用于Visual Basic P代码的debugging器)( 下载 )
- x64_dbg
- Zetadebugging器
其他链接
- 合作RCE工具库
– 大量的debugging器和系统级工具 - cr4zyserb
– 大量的插件和其他debugging工具 - 如何编写Windowsdebugging器参考(Devon Straw)
– 大量链接给你详细的信息,如果你想编写你自己的debugging器,如PDB文件格式,.DMP文件格式,PE文件结构,如何logging堆栈跟踪等,将需要。 - Tuts4You
– 解包器,IDA,OllyDBG,免疫debugging器插件等
这是一个非常广泛的问题。
- 第一步是将转储文件加载到WinDbg实例中。
- 接下来,你需要确保你有一个符号设置。
- 最后,您可以运行命令
!analyze -v
来获得对其进行的基本分析。 你需要有符号信息可用于你的代码,使转储文件值得。
网站内存转储,软件跟踪,debugging,恶意软件,受害者软件和情报分析门户网站已经为我提供了很多信息。 我也非常喜欢这本书,由Mario Hewardt和Daniel Pravat撰写的“ 高级Windowsdebugging” 。
Tess Ferrandez有一套很棒的基本教程和实验 ,可以开始使用Windbg。 我强烈推荐他们。