• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Windbg入门
 

Windbg入门

on

  • 2,353 views

 

Statistics

Views

Total Views
2,353
Views on SlideShare
2,353
Embed Views
0

Actions

Likes
1
Downloads
24
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Windbg入门 Windbg入门 Presentation Transcript

    • WinDbg调试入门GTW 陈晓锋
    • 目录Windbg介绍Windbg安装配置转储(dump)文件Windbg常用命令高cpu实例分析内存泄漏实例分析其他调试工具
    • Windbg介绍
    • 什么是Windbg?• Windows上的调试工具• 默认的调试命令可以调试非托管程序• 通过扩展命令组件如SSO等,可以方便地 调试.NET托管程序
    • Windbg调试方式• 离线调试 – 创建程序的内存dump文件 – 使用windbg本机调试查看• 在线调试 – 附加到进程 – 设断点,查看实时运行信息。。。
    • Windbg适用场景• 内存泄漏• 性能问题 – 高CPU负载 – 运行慢,如死锁• 程序崩溃 – 异常
    • .NET扩展组件• 有两个扩展组件:SSO.dll和PssCor2.dll• PssCor2比SSO.dll增加了几个扩展命令• PssCor2可用于.Net3.5以下的程序• PssCor4用于.Net4.0的程序
    • Windbg安装配置
    • Windbg安装• 下载windows sdk安装Debugging Tools for Windows• 默认安装到C:Program Files中,建议拷贝出 来,和symbols、扩展组件一起放到一个统 一的目录下,如d:debug
    • Windbg配置• 设定symbols路径srv*d:debugsymbols*http://msdl.microsoft.com/download/symbols
    • 转储(dump)文件
    • 创建dump文件方式• Vista以上操作系统可以使用任务管理器直 接创建dump文件
    • 创建dump文件方式• ADPlus – 在windbg的安装目录下 – 命令行下运行 – 支持hand和crash模式
    • 创建dump文件方式• Process Explore – http://technet.microsoft.com/en- us/sysinternals/bb896653.aspx
    • Windbg常用命令
    • 程序相关命令• 加载扩展组件 >> .load d:debugpsscor2amd64psscor2.dll• 显示帮助 >> !help• 查看程序已加载的dll模块 >> lm• 查看程序运行时间信息 >> .time• 查看线程运行时间 >> !runaway
    • 线程相关命令• 查看线程池 >> !threadpool• 查看托管线程详细信息 >> !threads• 切换到指定线程 >> ~[thread id]s• 查看当前线程堆栈信息 >> !clrstack
    • 内存相关命令• 查看托管堆使用情况 >> !eeheap -gc• 查看托管堆对象信息 >> !dumpheap• 查看指定地址对象信息 >> !dumpobject (!do)• 查看数组对象信息 >> !dumparray (!da) -detail• 计算对象大小 >> !objsize• 查看对象引用关系 >> !gcroot
    • 异常相关命令• 查看所有异常信息 >> !dae• 打印详细异常信息 >> !pe
    • 进阶命令• 一次显示多个对象的详细信息 >> .foreach(myVariable {!dumpheap -type System.ArgumentNullException - short}){!pe myVariable;.echo *******}• 可配合dumpheap使用,需加一个“-short”参数,表示只输 出对象地址信息• 一次输出所有线程的堆栈信息 >> ~*e!clrstack• 查找输出字符串 >> .shell -ci "!da -details 01edc72c" find "key"
    • 高cpu实例分析
    • 分析流程• 最重要是查出当前线程正在执行的内容 ~[thread id]s 进入其他线程 进入某一线 程开始 分析 代码 查看所有线程 查看线程堆栈 信息 !threads !clrstack
    • 1、运行demo测试HightCpuTest,利用processxp创建转储(dump)文件2、输入命令“!threads”查看所有线程信息,第一列就是线程的id值3、执行”~7s“可以进入id为7的线程4、执行“!clrstack”查看当前线程堆栈信息,可能会提示当前线程不是托管线程,显示不了堆栈信息5、继续进入其他线程或执行“~*e!clrstack”6、会看到有几条线程在执行正则表达式的“CompileRegexRunner()”操作,这时可能大概估出与代码中的正则表达式匹配有关7、查看代码找出真正问题所在
    • 内存泄漏实例分析
    • 分析流程• 打开任务管理器/性能监视器, 判断内存泄 漏类型——原生/托管• 隔10到20秒分别创建dump文件,以便 windbg中分析对比• 使用windbg查看托管堆中什么对象增长比 较快,或占用内存最多• 查看对象信息并分析代码
    • 分析流程 !do xxxx 查看可疑对 象详细信息 分析开始 代码 比较dump对 查看对象引用 象增长情况 关系 !dumpheap -stat !gcroot xxxx
    • 1、运行demo测试LeakTest,利用processxp创建两个相隔15s左右的转储(dump)文件2、运行两个windbg程序,分别打开两个dump文件3、两边都执行”!dumpheap –stat”,查看托管堆使用情况,可以看到15秒左右对象增长很快(这里显示的大小是对象结构的总大小,没包括子引用对象大小)4、查看各类型的大小和数量,可以看到System.Int32[]增加得最快,15s内增加了200m左右!
    • 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对象的引用,交成了交叉引用!!
    • 内存引用关系 GC roots Host Client EventHandlerSystem.Bytes[]
    • 内存引用关系 GC roots Host Client EventHandlerSystem.Bytes[]
    • 其他调试工具
    • 其他调试工具• 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/
    • 参考资料• 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
    • Any Question?