c# - 当另一个应用程序关闭时,如何调试为什么应用程序无异常地死机?

标签 c# c++ .net debugging crash

我正在修复一个应用程序的错误,这是一种数据消费者/ worker ,从第三方应用程序获取数据,使用提供的 API 和库来执行此操作。它是基于 c++ 的 API,.net 应用程序使用一些 c++ 来访问库。此外 - 该应用程序是多线程的,它是窗口化的(Winforms),使用了几个第三方库(nhibernate、mysql 等)。可能需要补充一点,当我们的消费者线程访问 C++ 库时,它是代码中唯一的地方。

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

我试过:

  • 遍历整个代码以查看它结束的时刻,但它总是发生在不同的地方,它是否调用了生产者的库代码。
  • 使用配置为在任何异常抛出时中断的 Visual Studio 调试应用程序 - 但它毫无结果地死掉了。
  • 创建崩溃转储(使用 ADPlus.vbs)并在其上使用 windbg(虽然我是这种低级调试的新手),但是 !analyze 产生了不同的堆栈跟踪 - 让我无迹可寻.

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

[编辑]

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

我和我的同事决定注释掉一些代码,以找到可能导致问题的代码。可能我们已经找到了——当且仅当我们将消费者注册到生产者时,应用程序才会终止。看了第三方app的文档,发现consumer app必须主动查询关闭producer的消息,否则会被producer app强行终止。

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

最佳答案

这里描述的一般场景是一种非常常见的混淆和误解的来源,这些混淆和误解与人们试图理解“我的应用程序怎么会消失得无影无踪,没有留下任何痕迹”的情况有关?

直接的假设是:我的应用程序'死亡''崩溃''遇到了这样的意外异常,调试器甚至看不到它因此没有创建任何转储文件。发生在我身上的好时光......

在大多数情况下,真正的答案是应用程序并没有真正崩溃或死机,也没有收到任何异常,而是简单地正常关闭,但来 self 没有的流程期待。

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

希望对你有帮助

关于c# - 当另一个应用程序关闭时,如何调试为什么应用程序无异常地死机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14679686/

相关文章:

c# - 将类型变量作为通用类型参数传递给静态类

c# - 通过 ssl 调用 web 服务并使用客户端传递

c++ - 这 4 个 lambda 表达式有什么区别?

c++ - 如何修改 CTAGS 生成的标记文件的默认分隔符

.net - 继承和复合外键 - 一部分在基类中,另一部分在派生类中

c# - 通过上下文访问 ASP.NET 应用程序中的 session

c++ - 如何在 OSX 上的 Carbon 文本字段中设置文本?

C# BaseStream 返回相同的 MD5 散列,不管流中有什么

c# - 查看文件路径是否在目录内

c# - 我如何模拟我的通用 Unity 解析包装器?接到电话是模棱两可的