gpt4 book ai didi

c++ - 寻找调试棘手的 Windows 服务启动 gremlin 的想法

转载 作者:可可西里 更新时间:2023-11-01 15:25:16 24 4
gpt4 key购买 nike

在过去的几个月里,我收到了一些来自 QA 的关于我们的一项服务挂起的报告。在使用 WinDbg 检查挂起转储时,每次我都会发现同样的事情:Loader lock critical section 已被锁定,但找不到拥有线程。由于线程消失了,我唯一能看到的痕迹是它留下的全局临界区,我看不到线程线程上运行了什么代码,甚至看不到该线程来自哪个 DLL,它甚至可能不是其中之一我们的(即第三方供应商)。

这个问题非常偶发,在过去 6 个月里只在野外自然发生过 3-4 次。所有其他时间,服务运行完美。所以这让我相信这是某种时间/竞争条件。

最近,我决定自己解决这个问题。我用 WinTask 脚本设置了一台机器,不断启动/停止上述服务。好消息是我可以在 5-6 小时内重现该问题。

现在进入下一部分:如何隔离它?

这是我到目前为止尝试过的:

  1. 使用 gflags 图像设置中的“调试器”字段来在启动时自动在 cdb 下运行该服务。到目前为止,它已经运行了两天并且从未挂起,所以我认为调试器引入了足够的时间更改以使问题不可见。

  2. 已下载 Application Verifier 并将流程配置为使用它运行。发现了一个完全不相关的错误,我们创建了 CComBSTR 临时变量,将其分配给 VARIANT 并将变体传递给函数调用,即使 CComBSTR 很早就删除了分配的字符串。不要相信这个错误是相关的,因为字符串是只读的并且它运行的线程不是正在死亡的线程。

我写这篇文章是为了防止你们想到我没有考虑的事情。

我虽然有一个 Windows 实用程序人为地给 CPU 施加负载并做了其他事情来弹出竞争条件,我认为应用程序验证器做了这样的事情,但显然它没有。有谁知道我在做什么,还是我只是在做梦?

除非周末发生什么事,否则我的下一步将是禁用所有调试器,返回库存并破解其中一个 DllMains 以记录 THREAD_ATTACH/THREAD_DETACH 事件。至少我能够拦截在创建时正在死亡的线程。这可能会有所启发。

最佳答案

我可能会尝试附加一个内核调试器,然后在 Appilcation Verifier 下运行该进程。 AV 会检查在它持有 CS 时卸载 DLL 并终止仍持有 CS 的线程。因此,这些断点应该在内核调试器中触发,然后希望您可以立即捕获它。在 KD 下运行它有望不会像用户模式调试器那样减慢速度。

关于c++ - 寻找调试棘手的 Windows 服务启动 gremlin 的想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8867904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com