VS 控制台中的应用程序验证程序报告和错误:Deleting critical section with invalid lock count

我打开了 appverif.exe,将我的二进制文件添加到列表中并启用了“基本”测试。保存更改后,我使用 Visual Studio 在调试模式下打开了应用程序。更准确地说,我首先启动了该服务(该应用程序是作为 SYSTEM 运行的服务,因此我需要稍后附加到它),然后我将 VS 调试器附加到该进程。

有时应用程序会在 DeleteCriticalSection 之后崩溃,并且 VS 控制台窗口中会显示以下消息:

VERIFIER STOP 00000208 - Deleting critical section with invalid lock count
    05AAEB48 : Critical section address. Run !cs -s <address> to get more information.

我想这意味着 CRITICAL_SECTION 变量已被删除,而另一个线程对其进行了锁定。对吗?

怎样才能避免这样的问题?

我知道理想的工具是引用计数器,以便只有拥有对指针的最后一个引用的人才能删除对象。这已在 C++11 及更高版本中实现,但未在纯 C 中实现。

缓解措施可能是注册第一次使用该变量的每个线程。当一个线程想要删除变量时,它首先检查队列是否只包含它的 id,如果是这种情况,则删除完成,否则要求队列中的最后一个线程。当然,该变量可能仍被从未使用过它的线程使用,因此该线程尚未注册到队列中,并且仍然可以对该变量调用 EnterCriticalSection 并导致崩溃。另一个问题是您需要使用另一个 CRITICAL_SECTION 变量保护队列访问(至少是写访问),因此您只是将问题从一个变量转移到另一个变量。

有什么想法吗?

bxgwd0904 回答:VS 控制台中的应用程序验证程序报告和错误:Deleting critical section with invalid lock count

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/543185.html

大家都在问