我正在开发一个经典ASP Web应用程序,使用了几个VB6编写的老的COM组件。 所有的VB6组件都注册在一个COM+应用程序中,以自己的dllhost进程运行。 应用程序的大部分已转换为.Net,但仍有许多遗留页面和组件。 COM互操作在两个方向上被使用,从经典ASP和VB6调用一些.Net程序集,以及从ASP.Net调用VB6组件。 该应用程序在Windows Server 2008 R2(IIS 7.5)上运行于经典管道模式。
大部分情况下,该应用程序工作正常。 转向.Net的努力最终被放弃了,而是开发了新产品。 同时,必须维护旧产品状态。
我有问题跟踪一个间歇性的问题,即Web应用程序挂起。 用户只见到空白屏幕,而浏览器等待且服务器不响应。 悬挂持续到我手动杀死托管VB6组件的dllhost进程,因此我认为问题隐藏在组件中。 可能是内存泄漏或失控的循环。
系统每天有数千个用户,但问题只会在一两个星期发生一次。 幸运的是,我们有一个Web Farm,当服务器停止响应时,自动将服务器拉出,因此客户影响为零。 不过,我仍然想搞清楚发生了什么。
我重新编译了所有的VB6组件以包括调试符号并重新部署到生产环境。 当问题发生时,我使用32位任务管理器(c:\ windows\syswow64\taskmgr.exe)来获取dllhost进程的崩溃转储。 我最终得到一个dllhost.dmp文件,将其带到开发工作站并在VS2010中打开。 我在我的符号路径中有VB6创建的.pdb符号文件。 当我在VS2010中启动调试会话时,我可以转到模块屏幕,并查看确实加载了我组件的所有符号。
从这里开始怎么办呢? 调用堆栈没有显示任何我的组件。 它看起来像这样:
(图片已略)
顶部调用堆栈的反汇编看起来像这样:
(图片已略)
不确定我还能做什么。 我检查了调用堆栈每个框架的所有本地内容,对我来说都是无意义的。 我没有看到任何对我的组件的引用。
也许WinDbg会提供更多信息? 我不确定该从哪里开始。
我很确定,如果我能找到挂起发生时正在调用的VB6类/方法,我就能找到问题的根源。 我尝试添加了一些日志记录,结果不一致。
也许我的VB6组件完全没有问题,而是遇到了Windows或IIS中的某些错误?
大部分情况下,该应用程序工作正常。 转向.Net的努力最终被放弃了,而是开发了新产品。 同时,必须维护旧产品状态。
我有问题跟踪一个间歇性的问题,即Web应用程序挂起。 用户只见到空白屏幕,而浏览器等待且服务器不响应。 悬挂持续到我手动杀死托管VB6组件的dllhost进程,因此我认为问题隐藏在组件中。 可能是内存泄漏或失控的循环。
系统每天有数千个用户,但问题只会在一两个星期发生一次。 幸运的是,我们有一个Web Farm,当服务器停止响应时,自动将服务器拉出,因此客户影响为零。 不过,我仍然想搞清楚发生了什么。
我重新编译了所有的VB6组件以包括调试符号并重新部署到生产环境。 当问题发生时,我使用32位任务管理器(c:\ windows\syswow64\taskmgr.exe)来获取dllhost进程的崩溃转储。 我最终得到一个dllhost.dmp文件,将其带到开发工作站并在VS2010中打开。 我在我的符号路径中有VB6创建的.pdb符号文件。 当我在VS2010中启动调试会话时,我可以转到模块屏幕,并查看确实加载了我组件的所有符号。
从这里开始怎么办呢? 调用堆栈没有显示任何我的组件。 它看起来像这样:
(图片已略)
顶部调用堆栈的反汇编看起来像这样:
(图片已略)
不确定我还能做什么。 我检查了调用堆栈每个框架的所有本地内容,对我来说都是无意义的。 我没有看到任何对我的组件的引用。
也许WinDbg会提供更多信息? 我不确定该从哪里开始。
我很确定,如果我能找到挂起发生时正在调用的VB6类/方法,我就能找到问题的根源。 我尝试添加了一些日志记录,结果不一致。
也许我的VB6组件完全没有问题,而是遇到了Windows或IIS中的某些错误?
任何建议都将受到赞赏,但目前放弃VB6不是一个选择。谢谢。