如何调试为什么当另一个应用程序关闭时应用程序无异常死亡

本文关键字:应用程序 异常 另一个 何调试 调试 为什么 | 更新日期: 2023-09-27 17:57:13

我正在修复应用程序上的错误,即数据消费者/工作者,使用提供的 API 和库从第三方应用程序获取数据。它是基于 c++ 的 API,.net 应用程序使用一点 c++ 来访问库。另外 - 该应用程序是多线程的,它是窗口化的(Winforms),使用多个第三方库(nhibernate,mysql等)。可能需要补充一点,我们的使用者线程是代码中唯一的位置,当它访问 c++ 库时。

问题出在哪里?当生产者应用程序关闭时(需要更多时间,超过一分钟),消费者应用程序会在几秒钟内死亡,没有错误/异常 - 甚至认为它们是独立打开的。事件日志中没有信息,没有 Dr. Watson 操作,Visual Studio 中没有异常(调试只是停止)。

我试过:

  • 遍历代码以查看它关闭的时刻,但它总是发生在不同的地方,是调用生产者的库代码,还是不调用。
  • 调试了应用程序,Visual Studio 配置为在任何异常引发时中断 - 但它什么都没有死。
  • 创建故障转储(使用 ADPlus.vbs)并在它们上使用 windbg(不过,我是这种低级调试的新手),但是 !analyze 结果是不同的堆栈跟踪 - 让我无迹可寻

找出消费者应用程序死亡原因的好方向是什么?有没有办法解决这个问题(比如向用户显示提示消息,比如:"生产者应用程序正在关闭,消费者应用程序也会这样做!")?

[编辑]

使用者

应用程序是多线程的,它是一个使用者线程作为 UI 线程的插件。另外 - 我们用作生产者的第三方应用程序使用 COM 将信息发送到任何消费者应用程序(也称为附加组件)。

我和我的同事决定注释掉一些代码,找到代码,这可能会造成问题。可能我们已经找到了它 - 当且仅当我们将消费者注册到生产者时,应用程序才会死亡。在阅读了第三方应用程序的文档后,事实证明,消费者应用程序必须主动查询关闭生产者的消息,否则它们将被生产者应用程序强制终止。

所以:95% 的问题是我们正在查询数据的第三方应用程序正在发送 COM 消息以强制终止我们的应用程序(如果我们测试这是唯一的原因,我会发布信息/更改为 wiki)。

如何调试为什么当另一个应用程序关闭时应用程序无异常死亡

这里描述的一般情况是一个非常常见的混淆和误解的来源,这些混淆和误解与人们试图理解"为什么我的应用程序消失在空气中而没有留下任何痕迹?"的情况有关。

直接假设是:我的应用程序"死亡"或"崩溃""遇到此类意外异常,调试器甚至不可见,因此没有创建任何转储文件。发生在我身上的几次好时光...

在大多数情况下,真正的答案是应用程序并没有真正崩溃或死亡,也没有收到任何删除,而只是优雅地关闭了,但来自我没想到的流程。

调试此类情况的最简单方法是在kernel32!ExitProcess中放置一个断点,并遵循堆栈,看看我们是如何到达这里的。

希望这有帮助

事实证明,是主机应用程序杀死了我的应用程序。调试问题的正确方法是监视Windows消息并查看我的应用程序是否正在收到进程终止消息。