最新消息:

用户异常处理的一些心得 ZZ

技术相关 admin 1807浏览

从alisdn上转过来的,很全面,不错的东西。

  1. 设置windbg的符号方式srvd:symbolshttp://msdl.microsoft.com/download/symbols
  2. 如何设置windbg的远程调试模式。
    远程调试最好的是dbgsvr模式,即符号可以位于调试机的模式
    1) 在目标机器上C:Program FilesDebugging Tools for Windows>dbgsrv.exe -t tcp:port=1234,password=spat
    2) 在你的机器上 windbg.exe -premote tcp:server=192.168.1.102,port=1234,password=spat -p 596 //where 596 = PID of target
    3) 最后只要设置你自己的符号即可
  3. 如何设置windbg 可以使用!address命令
    参照1设置路径即可。
  4. sys的抓取dump的工具条 /developer:thesys
    1) sys的工具
    2) windbg .dump /ma c:mydump.dmp 或者参考windbg 的.dump命令
    3) adplus 方式
    adplus -crash -pn test.exe -o c:mydumps
    adplus -hang -pn test.exe -o c:mydumps
  5. 调试器随程序启动调试
    1). 使用全局标志编辑器 (Gflags.exe)
    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options
    请注意 Gflags.exe 文件通常位于以下目录: C:Program Files Debugging Tools for Windows。
    运行 Gflags.exe 文件以启动全局标志编辑器。
    在 图像文件名称 文本框中,键入承载您要调试的服务的进程的映像名称。 是例如如果您要调试由具有 MyService.exe 作为图像名称的进
    程承载的服务,键入 MyService.exe 。目标 下, 单击以选择 图像文件选项 选项。图像调试器选项 ,下单击以选中 调试器 复选框。
    调试器 文本框中键入您要使用的调试器的完整路径。 是例如如果您要使用 WinDbg 调试器调试服务,您可以键入类似于以下内容的完整路
    径: C:Program Files Debugging Tools,for Windowswindbg.exe 单击 应用 ,然后单击 确定 以退出全局标记编辑器。

    or http://support.microsoft.com/?kbid=824344
    2) 在此键值下建立Debugger=c:mydbgautodump.bat 内容如下:
    cscript.exe c:debuggersadplus.vbs -crash -o c:mydumps -sc %1

  6. 替换目标机器上的默认调试器比如Dr. Watson
    1) drwtsn32.exe 能够启动,另外添加 -i 参数可以注册它作为调试器
    2) 编辑aedebug
    HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersion AeDebug
    3) 替换Debugger 从drwtsn32.exe -p %ld -e %ld -g 为
    windbg.exe -p %ld -e %ld -c “.dump /mfh c:myfile.dmp;q”

  7. 常见windbg 命令
    1) r d e read/dump/edit registry
    2) d 可扩展为dd dc db dw 等
    3) dds 可以查看esp上的stack符号列表 , 也可确认vtable是否合法
    dds esp
    x t2!A::vftable …. , dds addr
    4) s -a/-u address length pattern 可以查询asii或者unicode的字符串在范围内
    s -a 00400000 L?50000 “taobao.com”
    5) ba [r/e][1/2/4] var/address 可以设定指定地址的访问断点
    6) !runaway 可以查看线程对时间的占用
    7) ~kb 可以查看所有线程的堆栈
    x var/symbol 可以查看地址,比如 x msvcrt!printf
    9) u address , 可以反汇编指定地点的代码
    10) 超过3个参数的检查
    .frame /r framen
    查看esp,然后找到想要的参数
    dd/du/dc address 即可
    11)dt 显示指定地址处的内存结构
    dt this … dt this CMyClass
    12) wt 递归显示所在点之后的调用状况 , wt -l2 递归展示两级
    13) 异常断点的设置
    sxx/sxn/sdd 启用
    sx{e|d|i|n} [-c “Cmd1”] [-c2 “Cmd2”] [-h] {Exception|Event|
    }
    cmd1表示 first change , cmd2 sencond change
    举例来说,某个模块加载时候:
    sxe ld:t2.dll
    这样当加载t2.dll 时候将触发一个断点
    av : Access violation
    eh: C++ EH exception
    ….
    14) 一些稍高级的调试统计指令
    ba w4 t2!g_cnt “j (poi(t2!g_1) cmp12.log
    立刻能够看到以内存增量排序的backtrace的列表,然后可以具体查看这个backtrace然后
    使用!heap -p -a addr 来看callstack

尝试的方式和手段

  1. vertarget 看看系统运行了多久了
  2. !peb 查看环境信息
  3. 查看是否有msvcrd.dll 这类debug的dll加载
  4. lmf 查看是否有unload的模块,是否正常
  5. !analyze -v 观察问题描述

转载请注明:Kermit的网站 » 用户异常处理的一些心得 ZZ