分析core Dump文件一般好像都是用windbg, debugdiag, visual Studio 这三种工具。

Windbg

可以使用windbg来调试、抓取、分析程序的dump文件。

一、调试

注意。调试程序会导致该程序停止运行,不建议用来调试线上运行的后台程序。

配置

1. 直接调试可执行程序(*.exe)

点击 File-> Executable ,然后找到exe程序,打开即可 。

Debug->stop Debug可以停止调试。

2.调试正在运行中的可执行程序

先运行程序、然后打开windbg. File-> Attach to a process .

注意事项:

如果出现该程序调试端口已存在等错误,需要检查在本机是否已经启动了debug Diag相关进程。如果有,则关闭Dgbhost.exe 等进程,大概有两个。若是在开发环境,启动了VS的话,可能也需要关闭掉。都会占用被调试程序的调试端口。

3.调试运行时崩溃的程序

只要崩溃的程序没有关闭。

打开windbg. File ->Attach to a process ,选中崩溃的程序。、

在Command 中输入 [ ./dump /ma 要保存的文件完整路径名称], 提示Dump Successfully written后,就会生成一个dump文件。

二 、抓取

抓取程序的dump需要到windbg 中的adpplus,其中的抓取方式有三种。

1. Hang 模式

进程运行时,随时可以使用 -hang参数得到一个dump文件,而不需要考虑线程是否真的处于死锁中,用于诊断高内存使用率,高CPU使用率。

在hang模式下,dump file 是以非侵入方式被抓取的,并没有终端线程,因此不需要跟启动进程有相同的身份,在客户端调试服务器时,hang模式抓取dump file 很有用。

使用: 在命令行进入windbg所在目录,然后执行 adplus -hang -pn prs.exe -o c:/dump

2. crash 模式

在进程异常终止时抓取dump file .进程异常终止有3种情况。

1. unhandled  exception .

2.  asp.net 进程由于iis reset 或recycle 而终止。

3. 出现heap 毁坏,栈溢出,内存不足,等错误。进程必须退出。

使用: adplust -crash -pn w3wp.exe -NoDumpOnFirst

3. 使用配置文件

用adplus 指定配置文件,在某个特定的条件下,生成dump file,并把dump file存在指定目录下。

dump 分析工具 memory windows dump分析工具_堆栈

 使用: adplus -c myconfig.cfg -pn w3wp.exe

4. 服务启动自动附加调试的方法

在注册表:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options

1.指向 新建, 然后单机 键,在注册表编辑器左窗格,会注意到 新项 # 1(新的注册表子项的名称)中进行编辑。

2. 键入ImageName 替换 新项 #1 ,然后按Enter 键。

请注意:ImageName 是你要调试的服务的映像名称占位符。如果,你要调试具有Myservice.exe 作为图像名称的进程承载的服务,键入MyService.exe。 

3. 用鼠标右键单机在步骤E 中撞见注册表子项。

4. 指向新建,然后单机 字符串值, 在注册表编辑器右窗格,你会注意到新值 #1, 一个新的注册表项的名称选择进行编辑。

5. 使用debugger, 替换 新值#1, 然后按Enter键。

6. 右键单机你步骤h,调试程序注册表项, 然后单击,修改。 编辑字符串对话框。

7. 在该数值数据文字框中键入:DebuggerPath,然后单机确定。

        请注意:DebuggerPath 是调试器的完整路径,你要使用的占位符。如果你要使用windbg 调试器调试服务,您可以键入类似于以下的完整路径。
        C:/program /debugger/windbg.exe

Adplus 参数说明:

-pn : 指定要分析的进程名,使用多个 “-pn process name ”开关来指定多个进程。

-o: dump file 的存储路径,缺省为adplus 所在路径

-FullOnFirst: Creat Full Dumps on first Chance exceptions 

-MiniOnSecond

-NoDumpOnFirst: 如果exception 被try-catch block 处理,使用这个参数就不会生成dump file

-NoDumpOnSecond:

-quiet: NO dialog boxes will be displayed .

详解:

1. 什么是first Chance Exception 和second chance Exception

当程序抛出异常(.net 或native exception),此时这个exception为1 st chance exception。如果这个exception没有被try -catch Block 处理,这个exception就会成为2 nd chance exception ,(unhandled exception) 当前进程随后终止。

2.什么是Mini dump 和full Dump ?

user-mode Mini Dump ,保存了进程crash 是,virtual memory 的部分内容,有些SOS的命令在Mini Dump 上不能工作。 Mini Dump 的内容和大小跟被dump 的程序有关。MiniDump 所包含的信息并不一定比Full Dump少。

Full User-Mode Dumps 包含了进程的整个内存空间,程序的image ,handle table等调试信息。

分析Dump 

 点击 File -> Open Crash Dump, 然后选中要分析的dump 文件。打开它。

windbg 会自动打开command 窗口页,在其最下面的命令行可以输入各种指令来分析dump文件。

dump 分析工具 memory windows dump分析工具_visualstudio_02

常用Windbg 指令

1. !analyze -v 详细列出dump文件的信息,其中会有导致错误的代码片段,以及一些可供分析的数据。

2. kb 现时当前线程调用堆栈,一般可以确认是程序哪一行出了问题。

3. ~*kb 显示所有线程调用堆栈。

4. lm 显示当前加载的模块信息 (*.pdb *.dll)

5. kP 可以看函数的入参。

6. !for_each_frame dev /t : 可以看函数中的局部变量。

7. dc,db : 查看某一内存中的值,可以直接跟变量名,不过可能需要回溯栈。

8. !threads : 显示所有线程。

9:~0s,~1s: 进入某个线程。

10: !frame ProcessA!FunctionA: 查看某一个变量

11: !uniqstack: 扩展命令现实当前进程中所有线程的调用堆栈,除开重复的那些。

12:!teb: 扩展以的格式化后的形式现实线程环境块TEB的信息。

13:s-sa 和s-su: 命令搜索未指定的ASCII 和Unicode 字符串。这在检查某段内存是否包含可打印字符时有用。

14: dds、dps 和 dqs: 命令显示给定范围内存的内容。

        dds 是四个字节视为一个符号,dqs是每8个字节视为一个符号,dqs 是根据当前处理器架构来选择最合适的长度。

15:.kframes: 命令设置堆栈回溯显示的默认长度,默认20 .

16: k,kb ,kd,kp ,kP,kv: K * 命令显示给定线程的调用堆栈,以及其他相关信息。通常要结合12使用,否则显示出来的东西很少。

17: .reload /i xxx.dll :忽略。pdb文件版本不匹配的情况。

DebugDiag

获取dump文件

dump 分析工具 memory windows dump分析工具_堆栈_03

 

dump 分析工具 memory windows dump分析工具_字符串_04

dump 分析工具 memory windows dump分析工具_堆栈_05