从alisdn上转过来的,很全面,不错的东西。
- 设置windbg的符号方式srvd:symbolshttp://msdl.microsoft.com/download/symbols
- 如何设置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) 最后只要设置你自己的符号即可 - 如何设置windbg 可以使用!address命令
参照1设置路径即可。 - 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 -
调试器随程序启动调试
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 -
替换目标机器上的默认调试器比如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” -
常见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
尝试的方式和手段
- vertarget 看看系统运行了多久了
- !peb 查看环境信息
- 查看是否有msvcrd.dll 这类debug的dll加载
- lmf 查看是否有unload的模块,是否正常
- !analyze -v 观察问题描述
转载请注明:Kermit的网站 » 用户异常处理的一些心得 ZZ