DXM*_*DXM 11 c++ debugging multithreading windbg
在过去的几个月里,我收到了QA关于我们的一项服务的报告.在使用WinDbg检查挂起转储时,每次我发现同样的事情:Loader锁定临界区被锁定但拥有线程无处可寻.由于线程已经消失并且我能看到的唯一跟踪是它留下的全局关键部分,我没有看到在线程线程上运行了什么代码,甚至是线程来自哪个DLL,它甚至可能不是我们的(即第三方供应商).
这个问题是非常零星的,在过去的6个月中,它看起来可能是野外自然发生的3-4次.所有其他时间,服务运行完美.所以这让我相信这是某种时机/竞争条件的事情.
最近,我决定自己去做这个.我设置了一个带有WinTask脚本的机器,该脚本不断启动/停止所述服务.好消息是,我可以在5-6小时内重现问题.
现在为下一部分:我如何隔离它?
这是我到目前为止所尝试的:
在gflags图像设置中使用"调试器"字段,以便在cdb启动时自动运行cdb下的服务.到目前为止,这已经运行了两天而且从未挂起,因此我认为调试器引入了足够的时序更改以使问题不可见.
下载了应用程序验证程序并将进程配置为与之一起运行.找到一个完全不相关的错误,我们创建CComBSTR临时变量,将其分配给VARIANT并将变量传递给函数调用,即使CComBSTR长时间删除了分配的字符串.不要相信这个bug是相关的,因为string是只读的,并且它运行的线程不是那个正在死的线程.
我正在发帖子,以防你们想到我不考虑的事情.
我虽然有一个Windows实用程序人为地加载CPU并做了其他事情以使竞争条件弹出,我认为应用程序验证程序做了这样的事情,但显然它没有.有谁知道我正在采取什么,或者我只是梦想了吗?
除非在周末发生某些事情,否则我的下一步将是禁用所有调试器,返回库存并破解其中一个DllMains以记录THREAD_ATTACH/THREAD_DETACH事件.至少我能够拦截创建时死亡的线程.这可能会有所启发.
小智 2
我可能会尝试附加一个内核调试器,然后在应用程序验证器下运行该进程。AV 会检查在持有 CS 时卸载 DLL 并终止仍持有 CS 的线程。因此,这些断点应该在内核调试器中触发,然后希望您可以实时捕获它。在 KD 下运行它有望不会像用户模式调试器那样减慢速度。