Windbg入门

2,436 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,436
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
34
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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?

×