使用windbg调试托管程序的一些零散经验


设置好符号文件的路径,符号服务器的设置方法 :SRV*本地保存路径*符号文件服务器路径

不带"."随意敲一个命令似乎会导致windbg自动下载所有的pdb文件以试图执行该命令

使用.loadby sos mscorwks应该可以保证载入正确的版本,而不会出现No valid SOS data table found的错误
  如果机器上装有两个不同版本的.net framework的话,可以使用绝对路径来保证加载正确的版本

使用adplus.vbs  创建一个crash状态下asp.net进程的full dump的命令为 :adplus.vbs -pn aspnet_wp.exe -crash -quiet -o c:/path

windbg中使用组合指令的例子
 .foreach ( obj {!dumpheap -mt 79124418 -short}){!objsize ${obj}}
 
 .foreach (obj {!do -v 0x06269fd0 -short}){.echo ***;!do poi(${obj}+0x4);!do poi(${obj}+0x8);!objsize ${obj}}

 
 对于高CPU占用,一般的是这三个原因:

·         高的离谱的循环

·         太多的加载(比如,许多小的对象被频繁的处理)

·         GC作了太多的事情


使用 ~* e !clrstack可以 查看活动线程的堆栈

二代对象和一代对象的理想回收速率应该是1:10


GC占用大量的CPU时间,通常是由于Large object heap的过度使用

Large object heap 的过度使用通常由大Viewstate导致

大的viewstate通常由页面包含大量的表格数据,大量的自定义viewstate造成

有以下异常通常代表很大的viewstate,是由于viewstate校验失败引起
_ASP.AllThePeople_aspx === System.Web.HttpException: Invalid_Viewstate_Client_Disconnected Client IP: 141.150.12.56 Port: 62164 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0....) ViewState: dDwtNjY5ODIyMjI4O3Q8cDxsPFNUQVJUREFURTtFTkREQVRFO1BMVVN


可以设置WAS以阻止失效进程响应任何请求,同时保证进程继续运行;这就是所谓的隔离失效进程.一个隔离的工作进程被从应用程序池中移除,但将其保留在失效状态以便调试.这样,WAS开始另外一个工作线程所以应用可以继续响应请求.

隔离应用程序池中失效的进程,在/Inetpub/Adminscripts目录下执行:

cscript adsutil.vbs set w3svc/apppools/orphanworkerprocess 1   //该命令应用到所有应用程序池

应用到单独的应用程序池,使用:

cscript adsutil.vbs set w3svc/apppools/应用程序池名称/orphanworkerprocess 1

这样设置过之后,失效的w3wp.exe进程不会被中止,而是会停留在失效的状态,这样就可以使用调试器附加到进程,然后找出失效的原因.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值