windows 程序调试
调试工具
除了上专家级的windbg外,微软在windows软件开发工具包中包含有应用程序验证工具。
下面是微软对于该工具的介绍,可以作为比较容易使用的先用用获取对应的报告。
应用程序验证工具 ( # A0) 是用户模式应用程序的 动态验证 工具。 此工具在应用程序运行时监视应用程序操作,使应用程序成为各种强调和测试,并生成有关应用程序执行或设计中潜在错误的报告。 应用程序验证工具可以检测所有不基于托管代码(包括用户模式驱动程序)的用户模式应用程序中的错误。 它会发现在标准应用程序测试或驱动程序测试过程中可能难以检测到的细微编程错误。 您可以单独使用应用程序验证工具或与用户模式调试器一起使用。 此工具在 Microsoft Windows XP 和更高版本的 Windows 上运行。 当前用户必须是计算机上 Administrators 组的成员。 应用程序验证工具包含在 Windows 软件开发工具包 (SDK) 中.
基本的windbg指令
- !cpuinfo:获得CPU信息
- !analyze -v:让windbg自动分析原因
- !pcr 0 或者!pcr 1:分别观察不同的处理器控制区,这个区是操作系统给多核CPU用来进行id和线程区分的内存空间,一般一个cpu分两个内存页8KB大小。
- !locks:寻找可能存在的内核死锁对象
- .ecxr:读取用户态的转储文件
- .thread 线程地址:这个可以直接观察对应的线程
- kn,kvn:栈回顾/详细栈回顾,这个可以获得执行的函数
- !drvobj 驱动名:这个可以获取对应驱动的更多信息,获得驱动的驱动对象地址,也就是这个设备的实例。
- !devstack 驱动对象地址:可以观察到该设备栈的信息。
- !devnode 0 1:显示系统中所有设备的设备树,可以在这里搜索驱动名
- uf 函数: 可以反汇编对应的函数
- dd 基地址+8 l1:这个可以获取寄存器的线性地址。一般EBP+8是第一个参数
- !vtop 0 线性地址: 这个可以通过线性地址找到对应的物理地址
- !arbiter 2:可以显示系统中物理地址的分配情况,通过物理地址就可以看到所分配的地址区间对应的硬件
- !error 地址:可以获取该地址所对应的错误码信息
- p:单步调试
- lm vm 模块名:用来显示详细的模块信息
- !cs:获取线程的所有关键帧
- !address:获取内存地址信息
- !heap -a:获取程序的堆信息,这个可以获得可执行程序的内存基地址
- dpu 内存地址 L800:获取内存地址内的unicode字符
- s -u 内存地址 L800 “string”: 搜索在内存地址的空间内是否包含有对应的string
- ~:显示线程
- !do 内存地址: dumpobject 出对应的内存地址对象
- .writemem 内存区间 c:\dump.txt :从内存区间内dump出unicode的字符写入dump.txt文件.这个对于非英文的字符会出现乱码,需要修改头文件来进行修正。