元始天尊 发表于 2014-6-27 14:40:33

《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


元始天尊 发表于 2014-6-27 15:51:42

栈回溯       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]
查看完整版本: 《windows高级调试》学习笔记