Always Debug

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  7 随笔 :: 0 文章 :: 36 评论 :: 0 引用

公司的开发环境\测试环境和生产环境的区别都比较大.每次新版本启动前,都需要很长的时间来调试测试环境,很大一部分工作都在于改数据库链接,接口地址.然而看似简单的活却总是存在问题。上周五配置完环境出现了一个现象:cpu和内存的使用都很低,但网页却要很长的时间才能显示,根据以往的经验判断是某个接口地址估计又配错了,引起长时间的等待。但排查了一些最常用的地址后,相关的开发人员都找不出问题的根源。

即然dump文件可以记录活动的线程情况,应该可以用来发现等待点。以下是具体的分析过程,也许这是一个代价过高的方法,希望有更好方法的朋友分享一下。
(1)访问一下测试环境的网站,这时页面在进行长时间的等待,运行adplus.vbs -hang -pn w3wp.exe -o d:\ops\产生一个dump文件

(2)windbg打开产生的dmp文件,先用.load sos.dll加载sos扩展,运行~* e!clrstack查看所有线程的托管堆栈,得到的结果如下:

(3)从上图可以看到,有个线程在等待loadUrlFile方法返回,看看参数值是什么.运行~21 s切换到等待的线程上,运行!clrstack -a
省略一堆的输出,从里头后到如下内容:
0e93ee04 7a5ad0a9 System.Net.Connection.SubmitRequest(System.Net.HttpWebRequest)
    PARAMETERS:
        this = 0x06c97120
        request = 0x06c96844
    LOCALS:
        0x0e93ee1c = 0x00000001
        0x0e93ee18 = 0x00000000
        <no data>
        <no data>
        <no data>
        <no data>
        <no data>
        <no data>

(4)SubmitRequest的request参数应该就是请求的文件地址.!do 0x06c96844,看到request包含如下内容:
7a757bf0  4001f22       5c           System.Uri  0 instance 06c967d0 _Uri
7a757bf0  4001f23       60           System.Uri  0 instance 06c967d0 _OriginUri
790fd8c4  4001f24       64        System.String  0 instance 00000000 _MediaType
790ffcc8  4001f25       1c         System.Int64  1 instance -1 _ContentLength
7a78e938  4001f26       68 System.Net.IWebProxy  0 instance 06867e10 _Proxy
7a794fe8  4001f27       6c ...em.Net.ProxyChain  0 instance 06c96ddc _ProxyChain
790fd8c4  4001f28       70        System.String  0 instance 00000000 _ConnectionGroupName

运行!do 06c967d0 看看uri的值:

0:021> !do 06c967d0
Name: System.Uri
MethodTable: 7a757bf0
EEClass: 7a757a3c
Size: 40(0x28) bytes
 (C:\WINDOWS\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
790fd8c4  4001b51        c        System.String  0 instance 06c96728 m_String

封装得还真是多,汗一个,继续!do 06c96728

(5)看来程序是在等待bbs***/api/***.ph 地址返回,原来是网页上用到了一个取用户评分的接口,测试环境的接口配置到了一台已并闭的论坛服务器上,经修改后一切正常

如果此文对您有帮助,转载请保留出处:http://www.cnblogs.com/dbgeng/

0
0
(请您对文章做出评价)
« 上一篇:[开发技巧]用div挡住flash,给flash加上链接(兼容ie+firefox,具备a链接所有属性)
posted on 2009-06-27 17:43 dbgeng 阅读(1528) 评论(6)  编辑 收藏 网摘

评论

拿这些来练练手还不错。重在分析过程。
  回复  引用    

#2楼 2009-06-28 08:23 姜敏      
哇,那以后测试环境是不是会特别快了啊,这个消息好啊!真不错!
  回复  引用  查看    

#3楼 2009-06-28 08:27 姜敏      
项目中第三方接口太多,实在是麻烦,有什么问题都需要找别人来协助,太浪费时间了,这种没用了的接口也没有管理起来,造成些额外的烦恼。
  回复  引用  查看    

你项目的PM干啥吃的?3rd interface太多,这是他的问题,和你丫有啥关系捏?!
  回复  引用    

#5楼[楼主] 2009-06-29 09:59 dbgeng      
@姜敏
--引用--------------------------------------------------
姜敏: 项目中第三方接口太多,实在是麻烦,有什么问题都需要找别人来协助,太浪费时间了,这种没用了的接口也没有管理起来,造成些额外的烦恼。
--------------------------------------------------------
文中我更多关注在了如何去发现问题,因为之前解决方式大多是:
测试环境查询太慢,测试直接找到相关的开发人员,开发人员简单核对了一下配置,也许就直接发现了问题.有的开发则会在程序中增加了一堆记时间的log,最后发现是在等待bbs接口.

关于避免第三方接口的问题,个人感觉很多在于责任感上.也许大家都多做一些,无论是设计/开发时多整理一下,把所有用接口的地方放到一个配置中.或是配置人员记录一下所有要改的地方,还是接口提供方多设置一些提醒,应该都可行
甚至于问题存在了,解决的方式还分很多种:
(1)确定了在等待bbs接口返回,如果仅仅根据这个结论直接找到负责bbs接口的开发,
问题会是"好像测试环境的接口出问题了呀?",
回答往往是"测试环境的bbs接口是可以用的,不信你去看看另一个测试环境?"

(2)往下再做一步,在测试环境上访问或ping一直接口的地址,
问题就变成"好像ip为192.*.*.*的机器bbs接口不正常?"
回答就会变成"哦,那个机器的接口已经不用了,请转到.....上"


  回复  引用  查看    

#6楼[楼主] 2009-06-29 10:10 dbgeng      
@看不惯
--引用--------------------------------------------------
看不惯: 你项目的PM干啥吃的?3rd interface太多,这是他的问题,和你丫有啥关系捏?!
--------------------------------------------------------
也许还是责任感的问题吧:)

  回复  引用  查看