记录下自己使用WinDbg分析Dump时常用的一些方法和命令

 1 !analyze -v        //找出出错的堆
 2 .exrc             //找到程序崩溃的位置
 3 !heap             //打印出错函数的局部位置
 4 !for_each_frame dv /t  //显示call stack内容
 5 ~*kbn           //显示所有线程信息
 6 ~线程号 s           //切换线程
 7 kbn                  //显示当前线程信息
 8 .reload              //加载符号信息
 9 !runaway 19        //查看19号线程所用时间
10 .load wow64exts
11 !sw                   //切换到64位

 定位UnhandledExceptionFilter崩溃

1.~*kbn查看所有线程信息,找到崩溃的线程(搜索UnhandledExceptionFilter)

232
0f 167fd40c 77f37f1a 167fd43c 77ede304 00000000 kernel32!UnhandledExceptionFilter+0xf5
233
05 168ff904 77e3eeaa 168ff9c0 00000001 7e0be23d kernel32!UnhandledExceptionFilter+0x1f8
06 168ff990 77f37f1a 00000000 77ede304 00000000 kernel32!UnhandledExceptionFilter+0x172

2.切换到崩溃线程

~232 s

3.输入dd 167fd43c(标志灰色背景的地址)

167fd43c  167fd53c 167fd55c 77f11288 00000001
167fd44c  00ca8fa4 167fd474 77f071b9 fffffffe
167fd45c  167fffc4 167fd55c 167fd510 167fe2d8
167fd46c  77f071cd 167fffc4 167fd524 77f0718b
167fd47c  167fd53c 167fffc4 167fd55c 167fd510
167fd48c  77ede0ed 00000000 167fd53c 167fffc4
167fd49c  77edf96f 167fd53c 167fffc4 167fd55c
167fd4ac  167fd510 77ede0ed 78b58518 167fd53c

4.输入.cxr 167fd55c(第二个参数)查看上下文,然后输入kb查看线程堆栈(输入.exr 167fd53c查看错误信息)

通过以上步骤即可调出崩溃线程堆栈信息,如果想看的更清晰,可以在代码中查看,按照如下步骤。

1.点击Call Stack按钮(或View->Call Stack)查看具体的堆栈信息

2.添加源码(File->Source File Path,路径之间用分号;分割

3.双击Call Stack中的堆栈信息,会自动定位好源代码中的某一行

4.点击Local按钮可以查看当前堆栈本地变量

_except_handler函数(SEH异常处理函数)

085df400 7c9232a8 085df4ec 085dffdc 085df50c Kernel32!_except_handler3_0x61

输入 .exr 085df4ec  获取异常信息

输入 .cxr 085df50c  获取上下文信息

IndexOutOfRangeException堆越界问题查询

1.找到gflags.exe,默认位置 C:\Program Files (x86)\Windows Kits\10\Debuggers\x86

2.管理员运行cmd到gflags.exe位置,输入

Gflag.exe /p /enable Test.exe

成功后会显示

Warning: pageheap.exe is running inside WOW64.
This scenario can be used to test x86 binaries (running inside WOW64)
but not native (IA64) binaries.

path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
    vxofflinetrendquerytool.exe: page heap enabled

3.使用WinDbg挂载到进程,崩溃后再命令行界面上有提示信息。

调试死锁问题

1.~*kvn/~*kb/~*kbn查看所有线程调用堆栈

2.找到WaitForSingleObject的那一行,记录第三列的数字,为该线程正在等待的句柄(00000300)

7  Id: 1c38.1cc Suspend: 0 Teb: 7ffd4000 Unfrozen
00 061bfed8 77e2baf3 00000300 ffffffff 00000000 ntdll!KiFastSystemCallRet
01 061bfef0 77e2baa2 00000300 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0x43
02 061bff04 0286cd64 00000300 ffffffff 0438f62c kernel32!WaitForSingleObject+0x12

3.使用!handle命令查看句柄00000300是什么类型

!handle 300 f

Object Specific Information下的Mutant Owner一列,具体案例参考https://blog.csdn.net/china_jeffery/article/details/78927524

调试运行中的进程

File->Attach to a Process
File->Open Source File     //打开源文件,F9可以设置断点

注意:设置断点之前需要先停掉进程,点击,点击/F5继续运行程序(F10单句调试,F11单步跟踪)

查看内存

查看普通变量的内存

一个正在运行的程序,若要查看其变量,可以在任务管理器中的进程详细信息找到对应进程,右键创建转储文件(Dump文件)

输入~*kbn查找出所有的进程,找到类似Test!main+0x10c字样的一行,为程序的入口,一般为0号线程,点击行号可以在Command窗口中输入对应的信息(或使用命令.frame 0n11;dv /t /v)

一步一步点击,找到你要看的对象的内存即可

查看静态对象的内存

之后再记录

其他

.reload -i命令无差别加载pdb,不匹配的pdb也会加载

lm显示加载的pdb,带有M字样的为不匹配,点开不匹配的模块可以看到模块的真正时间

.reload 正常加载

lm成功匹配的模块后边会有路径显示

参考

https://blog.csdn.net/china_jeffery/article/details/78927524

http://www.cnblogs.com/gaochundong/p/windbg_cheat_sheet.html

 

posted on 2019-01-21 16:09  AnotherICE  阅读(16231)  评论(0编辑  收藏  举报