收藏 分享(赏)

WinDBG调试技巧.ppt

上传人:weiwoduzun 文档编号:4528221 上传时间:2019-01-01 格式:PPT 页数:36 大小:644.50KB
下载 相关 举报
WinDBG调试技巧.ppt_第1页
第1页 / 共36页
WinDBG调试技巧.ppt_第2页
第2页 / 共36页
WinDBG调试技巧.ppt_第3页
第3页 / 共36页
WinDBG调试技巧.ppt_第4页
第4页 / 共36页
WinDBG调试技巧.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、WinDBG调试技巧,Leo Jiang ,什么是WinDBG,Debugging Tools for Windows简称为WinDBG 根据CPU指令架构的不同分为: x86版 下载6.8.4.0 AMD64版 下载6.8.4.0 IA64版 下载6.8.4.0,WinDBG可以调试什么?,调试应用程序 调试驱动 分析dump,WinDBG VS VC自带调试器,WinDBG利用自带的符号检查下载工具,可以获包含VC自带的符号文件外,系统大部分DLL或EXE的符号文件,调试粒度更小。而VC除了自带的符号文件,和自身产生的符号文件外,只能使用DLL导出的函数作为符号。 WinDBG可以调试驱动

2、;VC不能,只能作为普通的应用程序调试器 WinDBG和VC都支持远程调试,WinDBG和VC调试器的关系,相同的核心dbghelp.dll+dbgeng.dll 不同的IDE 只是VC没有把核心所有的功能都开放出来,WinDBG加载符号,File - Symbol File Path; 或者 Ctrl + S; 或者命令行,两种符号格式,srv*jiangfengbingsymbols$*http:/ 表示从jiangfengbingsymbols$这个可写共享去加载pdb,如果pdb不存在则从http:/ ; 表示;后面还有一个符号信息 D:workcodekistrunkproductw

3、in32d 表示要加载D:workcodekistrunkproductwin32d目录里面的pdb文件,让VC获得同样的符号加载功能,把WinDBG安装目录下的symsrv.dll拷贝到VC的IDE目录,类似于D:DevToolsMicrosoft Visual Studio 8Common7IDE,VC2005默认是有这个文件的,但版本已老 启动VC,打开Tools - Options中设置(每个版本的VC设置有所不同),用WinDBG保存dump,发现程序运行异常,又不能立刻确定原因,又怕调试后找不到原因,且现象不能重现。这个时候需要保存现场。 打开WinDBG,按F6 attach到目

4、标进程,然后.dump /ma C:dumpxxx.dmp 不要直接退出WinDBG,先detach在退出WinDBG,否则目标进程会被关闭 对测试来说,这个功能很有效。 dump不是崩溃的时候才能产生,而是随时可以产生,只要你会用WinDBG,使用WinDBG分析dump,KIS2008在编译的时候都保存了pdb文件,而且加入了异常模块生产dump,所以分析dump变成了程序员的基本要求 没有技巧,只有流程 加载崩溃程序的pdb(要版本相符),加载系统模块的pdb,符号越全越好;符号不全,可能导致你看到的stack是错误的 如何看加载了哪些symbol,使用命令lm,WinDBG会把该进程的

5、module都显示出来,如果有symbol,后面会显示symbols字样,对于应用崩溃(包括应用程序和驱动)产生的dump,在加载完符号后,可以让WinDBG自动分析分析,执行命令!analyze -v即可。 对于手工尝试的dump,一般current thread不是出问题的thread,所以要看所有的线程,执行命令*kb,显示所以的线程的call stack。 大部分问题,只要看一眼就出来了。设置好源代码的路径,甚至可以找到出问题的一行。 其他所要使用到的技巧后面再详细阐述。,注意,用户通过键盘触发的minidump是没有分析意义的。 调试,分析就是找联系;符号,代码,等都是联系的桥梁,如

6、果没pdb,怎么办?那image(目标dll或者exe)就是你的主要桥梁了,IDA将是你手中的另一个利器。,主动调试应用程序,打开WinDbg,Ctrl+E,打开想要调试的EXE 打开WinDBG,F6,attach到要调试的进程 *设置symbol加载路径,设置源代码目录,使用WinDBG就和VC一样,包括快捷键 *优点:如果你在测试的机器上调试问题,装VC根本不现实,而安装WinDBG则很容易,体积小,你只要把你开发机器上的符号,源代码共享,就可以利用这个体积轻量级的工具实现功能非轻量级的调试了。,被动调试,一般用来调试服务。因为我们没法由我们的调试器去加载服务进程。服务进程只能由serv

7、ice.exe去创建。 因此我们希望目标一启动,我们的调试器就attach上去了。 WinDBG自动的工具Global Flags可以帮我们的忙,当然也可以使用VC的即时调试器 大部分服务是不和桌面交互的,所以在WinXP下面,你还需要把服务设为和桌面交互的,否则WinDBG运行在一个你看不见的桌面,而你又过不去那个桌面。 sc config kis type= own type= interact 然后启动服务,你就看见WinDBG出来了 请快速的让进程走过RegisterServiceCtrlHandlerEx这个函数。 否则超时后,进程和WinDBG都会被结束,不再有调试机会。,被动 V

8、S 主动,调试是大胆假设,小心求证的过程 断点,watch 只要能达到目的就是好方法。 MessageBox VS _asm int 3 MessageBox 让程序运行到指定的地方,等待主动进入的调试 _asm int 3让程序运行到指定的地方,直接触发进入即时调试器,把WinDBG作即时调试器用,想要崩溃的时候就由WinDBG调试 执行windbg.exe -I,辅助Appliction Verifier,不是WinDBG的特有功能,VC的调试器也可以配合AppVerifier 原理:AppVerifier替换了一些关键API,并在这些API上作检查验证,并以调试信息输出和产生int 3中

9、断的形式告诉外面的调试器 用来发现一般调试发现不了的问题,和模拟低资源的情况,进阶技巧(命令篇),.exr 显示异常记录 !handle 显示一个handle的信息 .thread 切换current thread !locks 检查有无死锁 u 反汇编指定地址 d db dd 显示指定地址的内存 bp bc bd 下断点 清断点 禁断点 ba 下内存断点,进阶技巧(内核调试),联机内核调试是NT系统自带的一个功能,使用softice可以作单机的内核调试,但缺点太多,不再流行 掌握了双机连接的流程,调试驱动就像调试应用程序一样。 双机联调其他方式 1394卡,很方便,但需要host和targe

10、t机都有1394卡,虚拟机不能模拟 USB,XP很麻烦,需要特殊的cable,好像用VMWare可以调试Vista系统,进阶技巧(实战),一个真实案例的微缩版本 update.exe,kavstart.exe,kwatch.exe 你看到的现象是update.exe卡死,而真正的原因是kwatch.exe里面出了问题,进阶技巧(二次开发),利用WinDBG的二次开发接口进行开发 利用dbghelp.dll(+dbgeng.dll)进行定制功能的调试器开发,如:dump自动分析器 如果是完全安装WinDBG的,在WinDBG安装目录,将有一个sdk目录,里面有二次开发的头文件,lib文件,sam

11、ple和详细的帮助,驱动开发注意问题,Nonpaged和Paged Pool,Nonpaged资源有限,但Nonpaged可以在各个IRQL上访问 注意CPU切换,即KeWaitForXXX,KeSetEvent等的操作(例如:IRQL = DISPATCH_LEVEL时KeSetEvent第三个参数必须为FALSE,某些时候不允许CPU切换) IRQL过低时KeRaiseIrql,操作完再KeLowerIrql IRQL过高时,自己创建SystemThread去做,或者IoQueueWorkItem把任务插都system的队列里面去做 善于利用Bug Check信息,驱动的Verifier,DriverVerifier,WHQL测试,针对平台+驱动+功能的一个比较完备的测试 功能完整性 驱动稳定性 通过测试才可以获得驱动的数字签名 https:/ 订阅WHQL周报,其他工具,DeviceTree Winobj IrpMon DbgView( or DbgMon),End,Question & Answer Thanks!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 规范标准 > 国内外标准规范

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报