《windows高级调试》学习笔记
软件人员通常都知道许多高效的编码方法,例如极限编程、代码自动生成框架等,但他们很少知道一些高效的调试方法,有些软件开发人员经常加班和熬夜,往往是因为他们使用了一些抵消的方法调试复杂问题。用户态调试器:cdb ntsd windbg 内核态调试器:kd windbg
标准命令元命令(.)扩展命令(!)
tlist 以任务树形式列出所有进程
以非入侵方式调试Dnscache服务cdb -pv -psn Dnscache
调试转储文件windbg -z *.dmp
本地模式启动内核态调试器windbg -kl
输入输出重定向到内核态调试器ntsd -d ?
用户态提示符跳转到内核态提示符.breakin
延时.sleep<time>
查看已加载模块lm
查看调试目录信息!lmi ntdll.dll
查看指定模块头地址出的映像信息!dh
.reload重新加载符号 强制加载符号.reload rpcrt4.dll=78000000,86000
.reload命令失败时查看日志.sym noisy
验证符号!chksym 01001b90
查看符号x module!symbols => x *!*x kernel32!g_*
列出地址处匹配符号ln 01001b90
显示导致调试器停止的最近调试事件.lastevent
显示寄存器值r rzf rof 修改reax=1
伪寄存器:$ip(等同于.) $ra返回地址$retreg返回值寄存器$csp栈指针 $proc当前进程
$thread当前线程 $tpid $tid$t0~$t19
$ip $retreg$csp
x86 eip eax esp
x64 rip rax rsp
Itaniumiip ret0 bsp
r$retreg r$proc r$pebr$threadr$teb
反汇编u 注意空格和点位置
当前$ip uf. $ip之前8条指令 ub . $ip之后2条指令 u . L2 $ip之前2条指令 ub . L2
$ip和$ip+10之间的指令 u . .+a
栈回溯 k k <栈基址针> <栈顶指针> <指令指针>
反汇编当前$ip所在整个函数uf .
显示调用栈中的参数 kb <num>
显示调用栈使用的栈大小 kf <num>
转储内存 dc
下断点bp
~0 bp test!BGTest::Fibonacci_stdcall "resp"只在线程0上设置断点,触发后执行resp
列出所有断点bl
清除所有断点bc
符号断点bmbm test!*kbtest*bm *!*
延迟断点可以在未加载的模块上下断bu ole32!CoInitializeEx
查看变量值 dv/i显示存储位置 dv *!*
----------p50----------
页:
[1]