当另一个应用程序关闭时,如何调试为啥应用程序死机无异常?
Posted
技术标签:
【中文标题】当另一个应用程序关闭时,如何调试为啥应用程序死机无异常?【英文标题】:How to debug why application dies exception-less, when another application is closed?当另一个应用程序关闭时,如何调试为什么应用程序死机无异常? 【发布时间】:2013-01-18 17:40:06 【问题描述】:我正在修复应用程序上的错误,这是一种数据消费者/工作者,使用提供的 API 和库从第三方应用程序获取数据。它是基于 c++ 的 API,.net 应用程序使用一点 c++ 来访问库。另外 - 应用程序是多线程的,它是窗口化的(Winforms),使用了几个第三方库(nhibernate、mysql 等)。可能需要补充一点,当我们的消费者线程访问 c++ 库时,它是代码中唯一的地方。
问题?当生产应用程序关闭时(需要更多时间,超过一分钟),消费者应用程序会在几秒钟内死亡,没有错误/异常 - 即使它们是独立打开的。事件日志中没有信息,没有 Dr. Watson 操作,Visual Studio 中没有异常(调试只是停止)。
我试过了:
遍历代码以查看关闭的时刻,但它总是发生在不同的地方,是否调用了生产者的库代码。 使用配置为在抛出任何异常时中断的 Visual Studio 对应用程序进行了调试 - 但它一无所获。 创建故障转储(使用 ADPlus.vbs)并在其上使用 windbg(不过,我是这种低级调试的新手),但 !analyze 导致不同的堆栈跟踪 - 让我无迹.找出消费者应用程序为何死亡的好方向是什么?有没有办法解决这个问题(比如向用户显示提示消息,比如:“生产者应用程序正在关闭,消费者应用程序也会这样做!”)?
[编辑]
消费者应用程序是多线程的,它是一个消费者线程,作为 UI 线程的插件。另外 - 我们作为生产者使用的第三方应用程序使用 COM 将信息发送到任何消费者应用程序(也称为附加组件)。
我和我的同事决定注释掉一些代码,以找到可能导致问题的代码。也许我们已经找到了——当且仅当我们将消费者注册到生产者时,应用程序才会死掉。看了第三方应用的文档,发现消费者应用必须主动查询关闭生产者的消息,否则会被生产者应用强行终止。
所以:95% 的问题是我们正在查询数据的第三方应用程序正在发送 COM 消息以强制终止我们的应用程序(如果我们要测试,我会将信息/更改发布到 wiki,这是唯一的原因)。
【问题讨论】:
我的猜测是,这是由于堆栈溢出造成的,这通常(并非总是)是无错误终止的原因。 哪个应用程序是多线程的 - 你的还是第 3 方的?您的使用者线程是主(UI)线程的附加线程吗?此链接可能会有所帮助:Debugging a Stack Overflow (Windows Debuggers) 过去发生这种情况时,如果我在 VS (2010) 下运行程序,它不会中断,但输出(或 mebe 立即)窗口会显示异常消息。 只是一个想法-您是否尝试过将事件处理程序添加到 AppDomain.CurrentDomain.UnhandledException (msdn.microsoft.com/en-GB/library/…) 另一个想法是您可以设置调试器以捕获不同类型的异常-在 VS 中,去到 [Debug] 菜单并单击 [Exceptions...] 以获取选项。前者不会帮助您处理 *** 或损坏的进程... Hth 还将事件处理程序添加到Application.ThreadException
。
【参考方案1】:
这里描述的一般场景是一个非常常见的混淆和误解的来源,与人们试图理解 “我的应用程序为什么消失得无影无踪?”的案例有关。。
直接的假设是:我的应用程序 'died' 或 'crashed' 或 ' 遇到了这样的意外异常,调试器甚至看不到因此没有创建任何转储文件。发生在我身上的好几次......
在大多数情况下,真正的答案是应用程序并没有真正崩溃或死亡,也没有收到任何异常,而是只是优雅地关闭,但来自我没有的流程期待。
调试此类情况的最简单方法是在kernel32!ExitProcess
中放置一个断点,然后跟踪堆栈,看看我们是如何到达这里的。
希望对你有帮助
【讨论】:
【参考方案2】:事实证明,它的主机应用程序杀死了我的应用程序。调试问题的正确方法是监视 Windows 消息并查看我的应用程序正在获取 Process Terminate 消息。
【讨论】:
以上是关于当另一个应用程序关闭时,如何调试为啥应用程序死机无异常?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Dash 在通过 PyCharm 调试时会抛出 TypeError? [关闭]
当另一个字段有反馈时,为啥 bootstrap-4 输入组会拉伸?