Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Windbg入门

2,460 views

Published on

Published in: Technology
  • Be the first to comment

Windbg入门

  1. 1. WinDbg调试入门GTW 陈晓锋
  2. 2. 目录Windbg介绍Windbg安装配置转储(dump)文件Windbg常用命令高cpu实例分析内存泄漏实例分析其他调试工具
  3. 3. Windbg介绍
  4. 4. 什么是Windbg?• Windows上的调试工具• 默认的调试命令可以调试非托管程序• 通过扩展命令组件如SSO等,可以方便地 调试.NET托管程序
  5. 5. Windbg调试方式• 离线调试 – 创建程序的内存dump文件 – 使用windbg本机调试查看• 在线调试 – 附加到进程 – 设断点,查看实时运行信息。。。
  6. 6. Windbg适用场景• 内存泄漏• 性能问题 – 高CPU负载 – 运行慢,如死锁• 程序崩溃 – 异常
  7. 7. .NET扩展组件• 有两个扩展组件:SSO.dll和PssCor2.dll• PssCor2比SSO.dll增加了几个扩展命令• PssCor2可用于.Net3.5以下的程序• PssCor4用于.Net4.0的程序
  8. 8. Windbg安装配置
  9. 9. Windbg安装• 下载windows sdk安装Debugging Tools for Windows• 默认安装到C:Program Files中,建议拷贝出 来,和symbols、扩展组件一起放到一个统 一的目录下,如d:debug
  10. 10. Windbg配置• 设定symbols路径srv*d:debugsymbols*http://msdl.microsoft.com/download/symbols
  11. 11. 转储(dump)文件
  12. 12. 创建dump文件方式• Vista以上操作系统可以使用任务管理器直 接创建dump文件
  13. 13. 创建dump文件方式• ADPlus – 在windbg的安装目录下 – 命令行下运行 – 支持hand和crash模式
  14. 14. 创建dump文件方式• Process Explore – http://technet.microsoft.com/en- us/sysinternals/bb896653.aspx
  15. 15. Windbg常用命令
  16. 16. 程序相关命令• 加载扩展组件 >> .load d:debugpsscor2amd64psscor2.dll• 显示帮助 >> !help• 查看程序已加载的dll模块 >> lm• 查看程序运行时间信息 >> .time• 查看线程运行时间 >> !runaway
  17. 17. 线程相关命令• 查看线程池 >> !threadpool• 查看托管线程详细信息 >> !threads• 切换到指定线程 >> ~[thread id]s• 查看当前线程堆栈信息 >> !clrstack
  18. 18. 内存相关命令• 查看托管堆使用情况 >> !eeheap -gc• 查看托管堆对象信息 >> !dumpheap• 查看指定地址对象信息 >> !dumpobject (!do)• 查看数组对象信息 >> !dumparray (!da) -detail• 计算对象大小 >> !objsize• 查看对象引用关系 >> !gcroot
  19. 19. 异常相关命令• 查看所有异常信息 >> !dae• 打印详细异常信息 >> !pe
  20. 20. 进阶命令• 一次显示多个对象的详细信息 >> .foreach(myVariable {!dumpheap -type System.ArgumentNullException - short}){!pe myVariable;.echo *******}• 可配合dumpheap使用,需加一个“-short”参数,表示只输 出对象地址信息• 一次输出所有线程的堆栈信息 >> ~*e!clrstack• 查找输出字符串 >> .shell -ci "!da -details 01edc72c" find "key"
  21. 21. 高cpu实例分析
  22. 22. 分析流程• 最重要是查出当前线程正在执行的内容 ~[thread id]s 进入其他线程 进入某一线 程开始 分析 代码 查看所有线程 查看线程堆栈 信息 !threads !clrstack
  23. 23. 1、运行demo测试HightCpuTest,利用processxp创建转储(dump)文件2、输入命令“!threads”查看所有线程信息,第一列就是线程的id值3、执行”~7s“可以进入id为7的线程4、执行“!clrstack”查看当前线程堆栈信息,可能会提示当前线程不是托管线程,显示不了堆栈信息5、继续进入其他线程或执行“~*e!clrstack”6、会看到有几条线程在执行正则表达式的“CompileRegexRunner()”操作,这时可能大概估出与代码中的正则表达式匹配有关7、查看代码找出真正问题所在
  24. 24. 内存泄漏实例分析
  25. 25. 分析流程• 打开任务管理器/性能监视器, 判断内存泄 漏类型——原生/托管• 隔10到20秒分别创建dump文件,以便 windbg中分析对比• 使用windbg查看托管堆中什么对象增长比 较快,或占用内存最多• 查看对象信息并分析代码
  26. 26. 分析流程 !do xxxx 查看可疑对 象详细信息 分析开始 代码 比较dump对 查看对象引用 象增长情况 关系 !dumpheap -stat !gcroot xxxx
  27. 27. 1、运行demo测试LeakTest,利用processxp创建两个相隔15s左右的转储(dump)文件2、运行两个windbg程序,分别打开两个dump文件3、两边都执行”!dumpheap –stat”,查看托管堆使用情况,可以看到15秒左右对象增长很快(这里显示的大小是对象结构的总大小,没包括子引用对象大小)4、查看各类型的大小和数量,可以看到System.Int32[]增加得最快,15s内增加了200m左右!
  28. 28. 5、执行”!dumpheap –mt xxxx –l 100”,显示前100个指定类型的对象信息,当信息显示太多时,可随时按ctrl+break中断输出6、随机采样一个对象地址,执行命令”!do 0x1adfc1c”,查看对象详细信息,可以看到该对象是有100个元素的int数组7、对该对象再执行”!gcroot0x1adfc1c”,查看对象引用关系8、从引用关系,可以看到,int数组由LeakTest.Client对象引用,而LeakTest.Host经委托引用了该Client对象,而Client本身又带有了Host对象的引用,交成了交叉引用!!
  29. 29. 内存引用关系 GC roots Host Client EventHandlerSystem.Bytes[]
  30. 30. 内存引用关系 GC roots Host Client EventHandlerSystem.Bytes[]
  31. 31. 其他调试工具
  32. 32. 其他调试工具• DebugDiag(免费) – 另一分析dump文件工具,对分析原生程序内存泄漏很 有用 – http://www.microsoft.com/download/en/details.aspx?dis playlang=en&id=24370• CLR Profiler(免费) – http://www.microsoft.com/download/en/details.aspx?id= 16273• YourKit Profiler(商业) – http://yourkit.com/.net/profiler/index.jsp• dotTrace (商业) – http://www.jetbrains.com/profiler/
  33. 33. 参考资料• Debugging NET Applications With WinDBG – http://www.slideshare.net/CoryFoy/debugging-net-applications-with-windbg• I have a memory leak!!! What do i do? – http://blogs.msdn.com/b/tess/archive/2005/11/25/i-have-a-memory-leak- what-do-i-do-defining-the-where.aspx• Common WinDbg Commands – http://windbg.info/doc/1-common-cmds.html• I am getting OutOfMemoryExceptions. How can I troubleshoot this? – http://blogs.msdn.com/b/johan/archive/2007/01/11/i-am-getting- outofmemoryexceptions-how-can-i-troubleshoot-this.aspx• Getting started with windbg - part I – http://blogs.msdn.com/b/johan/archive/2007/11/13/getting-started-with- windbg-part-i.aspx• Production Debugging for .NET Framework Applications – http://msdn.microsoft.com/en-us/library/ee817663.aspx
  34. 34. Any Question?

×