使用Windbg和SoS扩展调试分析.NET程序
在博客堂的不是我舍不得 - High CPU in GC(都是+=惹的祸,为啥不用StringBuilder呢?)、 不是我舍不得 - .NET里面的Out Of Memory 看到很多人在问如何分析dump,所以就写下了这篇短文,抛砖引玉。
一、安装 DebuggingToolsforWindows: 从以下 Microsoft 网站下载 DebuggingToolsforWindows: http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx,微软经常更新DebuggingToolsforWindows工具的,所以我们下载一个最新版本的,把DebuggingToolsforWindows 安装到 C:Debuggers 文件夹,从命令行中运行工具需要一个简短的路径,这样更加容易使用。
二、为 WinDbg 中设置符号路径:
1.打开 WinDbg。 2.在 文件 菜单上, 单击 符号文件路径 。 3.在 符号路径 对话框中, 键入以下符号路径: srv*c:symbols*http://msdl.microsoft.com/download/symbols 4.关闭 WinDbg, 然后键入 是 Yes ,以保存基本区信息。
三、SOS 扩展
SOS.dll 中提供的 Son of Strike 扩展 (SOS),用于调试 WinDbg 中的托管代码。在启动了调试程序并将其附加到托管进程(或加载故障转储)后,您可以通过键入以下代码加载 SOS.dll:
.loadby sos mscorwks
如果您正在调试的应用程序使用的是不同版本的 mscorwks.dll,则该命令无法执行,那么应找到该应用程序使用的 mscorwks.dll 版本的 SOS.dll,然后运行以下命令:
.load <path_to_sos>sos.dll
SOS.dll 随 .NET Framework 安装在 %windir%microsoft.netframework<.NET 版本> 目录下。SOS.dll 扩展提供了大量用于检查托管堆的有用命令。有关所有这些命令的文档,请参阅 SOS 调试扩展 (SOS.dll)。
四、相关的资料:如何调试分析,有几篇非常不错的文章,大家自己慢慢去品味吧。
CLR 完全介绍: http://msdn.microsoft.com/msdnmag/issues/06/11/CLRInsideOut/default.aspx?loc=zh 深入探索.NET框架内部了解CLR如何创建运行时对象: http://www.microsoft.com/china/MSDN/library/netFramework/netframework/JITCompiler.mspx?mfr=true !dumpheap -gen in ,NET 2.0 SOS that Ships with the Framework: http://dotnetdebug.blogspot.com/2006/12/dumpheap-gen-in-net-20-sos-that-ships.html 在托管代码中设置断点(WINDBG) http://blog.joycode.com/gangp/articles/20417.aspx NET Framework 2.0 在内存中加载 Sos.dll 文件时 Windows 错误报告崩溃 FIX:http://support.microsoft.com/kb/913382/zh-cn SOS Debugging with the CLR :http://blogs.msdn.com/jasonz/archive/2003/10/21/53581.aspx 发现并防止托管代码中出现内存泄漏http://msdn.microsoft.com/zh-cn/magazine/cc163491.aspx
关于异常的疑难解答:System.OutOfMemoryException http://msdn.microsoft.com/zh-cn/library/9w766t6y(VS.80).aspx
- CentOS6.5安装Java 8以及Tomcat8
- Java基础06 组合
- 警告:MySQL-server-5.6.21-1.linux2.6.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY
- MySQL(五)之DDL(数据定义语言)与六大约束
- Java基础08 继承
- 关于python字典类型最疯狂的表达方式
- centos6.5使用yum安装mysql
- Java基础09 类数据与类方法
- MySQL(四)之MySQL数据类型
- JS魔法堂:ASI(自动分号插入机制)和前置分号
- Java基础05 实施接口
- JS魔法堂:函数节流(throttle)与函数去抖(debounce)
- mysql用户管理
- Java基础10 接口的继承与抽象类
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android中自定义ImageView添加文字设置按下效果详解
- Android中使用Kotlin实现一个简单的登录界面
- Android编程实现webview将网页打包成apk的方法
- Android 实现代码混淆的实例
- Android中复制图片的实例代码
- Android 两种启动模式的实例详解
- Retrofit2.0 实现图文(参数+图片)上传方法总结
- Android中使用GridView实现仿微信图片上传功能(附源代码)
- Android下载进度监听和通知的处理详解
- Android上传多张图片的实例代码(RxJava异步分发)
- Android仿微信语音消息的录制和播放功能
- Android如何自定义升级对话框示例详解
- Android Tiny集成图片压缩框架的使用
- 11个JavaScript代码重构最佳实践
- Android编程实现类似天气预报图文字幕垂直滚动效果的方法