windows - VS 控制台中的应用程序验证程序报告和错误:删除具有无效锁定计数的关键部分
问题描述
我打开了 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
因此您只是将问题从一个变量转移到另一个变量。
任何想法 ?
解决方案
推荐阅读
- discord - Discord 机器人发送不需要的消息
- azure-devops - 无法使用其他帐户登录 - Power Automate 的 Azure DevOps 连接器
- java - 需要将数组相乘的代码,如果数组为空则返回 0
- swift - 带有 Unicode 文字的字符串无法在 UILabel 上正确显示
- spring-boot - @Mock 和 @InjectMocks 注释不起作用
- file - 如何从框架中获取用户输入并保存到 txt 文件中?
- discord - 如何在 Discord.js 中使用其名称查找频道?
- hadoop - YARN 正常工作时资源管理器日志错误
- java - 使用 Comparator 的匿名类上的 NotSerializableException
- r - install.package("matlib") 在 RStudio 中显示非零退出状态错误