摘要:生产环境的调试不同于开发环境的调试,生产环境一般受条件限制,无论是在线调试还是抓dump,都不是很方便。比如生产环境的一个windows服务,你想用vs.net进行远程调试;比如你想让某个性能计数器达到一个值后自动抓dump;比如你想让某进程崩溃的时候自动抓dump,比如你想在程序里动态的生产进程的minindump;比如你想在iis应用程序池回收的时候自动抓取Dump。
一、远程托管调试
1、把D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\Remote Debugger\x86下的文件复制到生产环境的某目录下;
2、双击msvsmon.exe,在选项里选择“windows验证”,把本机的administrator密码改成和生产环境的机器一个名字;
3、打开本地的vs.net,打开生产环境服务的源码项目,点击调试菜单-附加进程,传输框里选择“默认”,限定符选择“administrator@ms-onlytiancai”,其中administrator是你登录当前机器的用户名,并且生产环境中也要有该账户,并且在调试组里,最好直接用超级管理员角色,ms-onlytiancai是生产环境机器的网络名字。输入限定符后保持输入焦点在限定符的文本框回车,然后下面会显示生产环境机器的进程,然后选中你要调试的服务进程,点附加就可以了。
4、在本地的vs.net的源码上设置断点,比如我想在当i值为9的时候设置断点,如下,当服务运行到可以出发条件断点的时候就本地的VS.NET就会自动断住,并可以让你进行监视本地变量,步进调试等操作了。
注意:msvsmon一定要选择windows验证,你用无身份验证或者tcp/ip调试,是无法进行托管程序调试的,只能当win32程序来调试,这是我费了好久功夫才得出的结论,我是用我本机的vs.net2005和虚拟上的一个console application进行调试的,两台机器都是新装的,没有对DCOM或者安全策略等进行一些调整,如果按我的方法不能调试,请参考后面的主要参考链接及其它参考链接,我只是给大家讲最简单最实用的步骤。
二、当CPU大于某阀值自动抓dump
比如说生产环境某服务CPU有时候偶尔会很高,或者内存有时候偶尔会很高,当运维人员发现的时候进程已经重启了或者现象消失了,就抓不住现行了,所以可以做性能警报,自动抓Dump。你还可以用.NET写自己的性能计数器,然后监控自己的计数器,当计数器达到不合理的值的时候就抓个dump.
关于创建自己的性能计数器,参考以下链接
http://www.cnblogs.com/onlytiancai/archive/2007/09/22/902310.html
1、开始-运行输入perfmon,在性能日志和警报下的警报节点,右键点新建警报,在常规页里输入要监控的计数器及阀值,然后在操作一栏里选择执行这个程序,选中cscript.exe方法,然后在命令行参数里,输入本地的你写的一个vbs脚本,最后点常规标签页,输入执行的用户名和密码。至于这个本地的vbs脚本,大致原理就是调用wsh.shell调用adplus抓你的进程的dump,如果不太熟悉wsh,可以到technet学习一阵子,实在不行买本《windows用户态高级编程》看看197页,或者是你熟悉cdb用法的话直接执行cdb,在命令行参数里输入cdb参数也可以。
但是,监控计数器抓dump,我从来没有实验成功过哦,呵呵。
三、当进程崩溃时自动抓dump
不知道你有没有遇到过这种情况,你的一个服务一启动就挂了,没机会让你用adplus -crash去挂上进程,这就需要用IFEO劫持了,你可以自己修改注册表,也可以用windbg自带的gflag来做,我就不重复了,大家直接看以下链接吧
http://support.microsoft.com/kb/824344
如果觉得机器的自动翻译的差,可以切换到英文页面去看
四、web应用程序池回收自动抓dump
有时候生产环境的web应用会异常的死锁,或者内存占用升高,而你设置了内存、CPU监控等,应用程序池在达到一定条件后会自动回收,但除了你自己设置的每隔固定时间回收,其它的情况,像死锁,CPU高等引起的回收都是不正常的,你不想在回首前抓个dump回来分析吗?
以下为引用
"IIS 6.0 有一项叫做“孤立工作进程”的新功能。此功能使您能在预定要回收的进程终止之前对其进行检查。孤立工作进程可用来在进程中附加一个调试程序并生成一个供调查使用的转储文件。"
以下为具体操作步骤,帖子不是我写的,我给大家贴个链接算了。
当 ASP.NET 在 IIS 6.0 中锁死的情况下,如何生成转储文件
http://support.microsoft.com/kb/828222/zh-cn#
另外adsutil.vbs这个脚本功能很强大,建议搞web的兄弟,或者对IIS感兴趣的朋友好好挖掘挖掘它的用法。
五、如何用程序生成动态生产dump
有时候你可能想在在程序执行在某种状态的时候,dbghelp.dll的MiniDumpWriteDump API就可以来完成这种操作,不过只能产生minidump。你可以在AppDomain.CurrentDomain.UnhandledException事件处理里调用这个API来抓dump。具体代码就不写了,参考如下链接。
MiniDumpWriteDump generates empty dumps in microsoft.public.vc.debugger
http://thesource.ofallevil.com/communities/newsgroups/list/en-us/default.aspx?dg=microsoft.public.vc.debugger&tid=a44f8825-a731-4ca4-ac3f-0c38da31ff17&cat=&lang=&cr=&sloc=&p=1
以上的链接是个讨论贴,具体代码可以参考帖子里贴出来的代码,然后自己再改改,我实验过,能生成Dump。如果要抓完整dump的话,可以用System.Diagnostics.Process.Start方法了调用cdb来抓Dump,我没实验过,仅提供一种思路。
小结:生产环境的问题千变万化,只在适当的时机抓取有价值的dump就得费很大的劲,结合clr,win32api,crt等分析Dump,解决问题那更是难上加难,不过我看博客园这么多人最近也经常发一些调试相关的帖子,相信大家在解决复杂生产环境问题上会越来越有经验。
最后:大家如果有一些比较难以调试解决的问题,比如死锁、CPU百分百,资源泄漏,运行诡异等问题,可以发到我的邮箱,大家一起讨论讨论,学习学习,互帮互助,共同进步。(只针对个人哦,咱不是专业咨询公司,所以也不承诺肯定能对解决问题起到帮助作用哦,呵呵。)
【主要参考链接】
Visual Studio 2005远程调试配置说明
http://bbs.msotec.net/PostAttachment.aspx?PostID=7825
Visual Studio 2005 Remote Debugger 远程调试器 注意事项
http://www.cnblogs.com/sun221/archive/2006/12/30/607852.html#FeedBack
GFlags Examples
http://www.osronline.com/ddkx/ddtools/gflags_4n77.htm
【其它参考链接】
远程调试组件
http://msdn.microsoft.com/zh-cn/library/ey7ec813(VS.80).aspx
What are your remote debugging scenarios?
http://blogs.msdn.com/greggm/archive/2004/06/22/162546.aspx
Remote debugging ASP.NET applications using Visual Studio 2008
http://blogs.iis.net/brian-murphy-booth/archive/2008/05/23/remoting-debugging-asp-net-applications-using-visual-studio-2008.aspx
如何:设置远程调试
http://msdn.microsoft.com/zh-cn/library/bt727f1t.aspx
Setting Up Remote Debugging
http://www.cnblogs.com/blueclown/articles/38958.html
Using the Visual Studio .NET 2003 Debugger with ASP.NET Applications
http://www.cnblogs.com/relang99/archive/2007/03/27/690106.html
VS2003能不能支持远程debug
http://topic.csdn.net/t/20050218/14/3789992.html
符号文件中不存在本机符号
http://forums.microsoft.com/china/ShowPost.aspx?PostID=3756905&SiteID=15
VS2005远程调试
http://www.msusenet.com/f--cn-dotnet-languages-csharp-249/t-vs2005oideo-1874880725.html
如何打开远程调试在带 Service Pack 2,在 Windows Server 2003 Service Pack 1,Windows XP 或 Windows Vista 中的
http://support.microsoft.com/default.aspx?scid=kb;[LN];833977#2020
设置远程调试
http://www.cnblogs.com/blueclown/articles/40348.html
如何:设置远程调试
http://msdn.microsoft.com/zh-cn/library/bt727f1t(VS.80).aspx
.NET远程调试的配置
http://www.erya.cn/archives/52
How to debug sql 2005 on remote machine. I am administrator on both my dev machine and remote sql server machine.
http://www.sqlmonster.com/Uwe/Forum.aspx/sql-server-clr/270/How-to-debug-sql-2005-on-remote-machine-I-am-administrator
进行并行调试
http://download.microsoft.com/download/5/7/c/57cf693d-eb5b-4bbf-adf4-0588227facb9/CCS03DebugParallelAppsVS05.doc
Visual Studio 2005 Remote Debugger 远程调试器 注意事项
http://www.cnblogs.com/sun221/archive/2006/12/30/607852.html
VC 2003远程调试步骤备忘
http://www.cnitblog.com/linghuye/archive/2008/02/16/39835.html
远程调试(Remote debug)
http://book.51cto.com/art/200711/59868.ht
定制调试诊断工具和实用程序
——摆脱DLL“地狱”(DLL Hell)的困扰(七)
http://www.vckbase.net/document/viewdoc/?id=1626
GFlags Examples
http://www.osronline.com/ddkx/ddtools/gflags_4n77.htm
WinDbg 文档翻译----91
http://www.cnitblog.com/cc682/
使用PageHeap.EXE或GFlags.EXE检查内存越界错误 (转载)
http://blog.bcchinese.net/happyjet/archive/2005/03/08/12713.aspx
是什么使得我的进程崩溃了?
http://www.cnblogs.com/Ring1981/archive/2006/10/24/450628.html
Enabling JIT-attach Debugging
http://msdn.microsoft.com/en-us/library/2ac5yxx6.aspx
Visual Studio Debugger Just-In-Time Debugging
http://blog.mdcsoft.cn/archives/200807/93.html
Debugging Applications for Microsoft .NET and Microsoft Windows
http://www.chmhome.com/Applications_net_windows/index.html?page=6769final%2FLiB0030.html
NTSD的安装部署及使用详细步骤-Dump文件的产生及分析
http://blog.csdn.net/yeming81/archive/2008/05/03/2370803.aspx
The Win32 Debugging Application Programming Interface
http://msdn.microsoft.com/en-us/library/ms809754.aspx
.Net 调式案例—实验2 崩溃(Crash)复习回顾
http://www.cnblogs.com/softfair/archive/2008/03/03/1088320.html
如何调试虚拟服务器服务在计算机上的运行 Virtual Server 2005 或 Virtual PC 2004,部分 2,共 2
http://support.microsoft.com/kb/871170/zh-cn
如何调试 Windows 服务
http://support.microsoft.com/kb/824344