常用指令
1. !analyze -v
2. kP 可以看函数的入参
3. !for_each_frame dv /t 可以看函数中的局部变量
4. dc , db 产看某一内存中的值 可以直接接变量名 不过可能需要回溯栈
5. !threads 显示所有线程
6. ~0s , ~1s 进入某个线程
7. !frame ProcessA!FunctionA 查看某一变量有时需要。 回溯栈
8. !uniqstack 扩展命令显示当前进程中所有线程的调用堆栈,除开重复的那些。
9. !teb 扩展以的格式化后的形式显示线程环境块(TEB)的信息。
10. s-sa 和 s-su 命令搜索未指定的 ASCII 和 Unicode 字符串。这在检查某段内存是否包含可打印字符时有用。
11. dds、dps 和 dqs 命令显示给定范围内存的内容。 该内存被假定为符号表中的一连串地址。相应的符号也会被显示出来。命令显示给定范围内存的内容,它们是把内存区域转储出来,并把内存中每个元素都视为一个符号对其进行解析,dds是四字节视为一个符号,dqs是每8字节视为一个符号,dps是根据当前处理器架构来选择最合适的长度
12. .kframes 命令设置堆栈回溯显示的默认长度。默认20
13. k, kb, kd, kp, kP, kv (Display Stack Backtrace) k*命令显示给定线程的调用堆栈,以及其他相关信息。通常要结合12)使用否则显示出来的东西很少
14. .reload /i xxx.dll 忽略.pdb 文件版本不匹配的情况。
设置Symbol File
1. 将远程的系统函数的PDB文件拷贝到本地「D:\mysymbol」目录下
SRV*D:\mysymbol*http://msdl.microsoft.com/download/symbols
2. 加载设置的符号文件
.reload
可以使用菜单中的 Debug -> Modules 查看有没有加载进来
设置Source File
把源码路径拷贝到Source File输入框
查堆破坏问题
错误代码:0xc0000374
错误含义:ACTIONABLE_HEAP_CORRUPTION_heap_failure_buffer_overrun
第一步、先用「!analyze -v」分析出错误的地方以及由于什么原因导致程序Dump掉的。
无非是内存溢出,访问非法地址等几种。
第二步、使用「!heap」找出出错的堆。分析出错的原因。
第三步、使用「!for_each_frame dv /t」打印出错函数的局部变量,找出元凶。
查无效参数(STATUS_INVALID_PARAMETER)
错误代码:0xc000000d
错误含义:STATUS_INVALID_PARAMETER
第一步、先用「!analyze -v」分析出错误的地方以及由于什么原因导致程序Dump掉的。
第二步、先用「!teb」看一下这个程序的栈是从哪里到哪里的。
第三步、先用「dps」看一下这个程序的栈中的内存的内容。 下面截取其中比较重要的一段。
查句柄泄漏问题
第一步、选择"Open Executable"再选择上述测试用例生成的exe,可能在实际工程中经常是"Attach to a process"。
第二步、windbg用ctrl+break命令中断进程运行,用!htrace -enable命令开启句柄检测;
第三步、再使用!htrace -snapshot命令,获得此时进程句柄的镜像。让程序继续运行。
第四步、中断进程运行,使用!htrace -diff命令获得当前句柄状态与第4步 snapshot镜像句柄的差异
第五步、使用lsa 传递指定位置对应的代码,lsa Lab2010_2!HandleLeakFunc+0x00000012