如何在Visual Studio中查看std::mutex的锁定线程?

7

使用 Windows 的 CRITICAL_SECTION,我可以通过展开变量看到锁定它的线程:

enter image description here

然而,我似乎无法通过std::mutex做到同样的事情,而是得到了许多无用的值:

enter image description here

是否有一种方法可以解决这个问题而不需要修改我的代码?


2
尝试将该值转换为 _Mtx_internal_imp_t* - PeterT
我尝试过,但是我在哪里可以找到它的内容?它似乎在公共资源中没有定义。 - riv
这是否意味着即使知道内部细节,我也无法找到锁定线程?在调试多线程应用程序时,这似乎是一个重大障碍。 - riv
3
它使用SRWLock进行锁定,但还额外存储线程ID,你可以在\crt\src\stl\mutex.c中看到。 - PeterT
啊,谢谢,这解决了问题。下次我遇到这个问题可以把它放在 natvis 中。 - riv
2个回答

12

感谢@PeterT的评论,为各种互斥类型编写了一个可视化工具(放置在/Documents/Visual Studio 2017/Visualizers/mutex.natvis):

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="std::_Mutex_base">
    <Expand>
      <Item Name="[thread_id]">*(long*)((char*)&amp;_Mtx_storage+sizeof(_Mtx_storage)-8)</Item>
      <Item Name="[count]">*(int*)((char*)&amp;_Mtx_storage+sizeof(_Mtx_storage)-4)</Item>
    </Expand>    
  </Type>
  <Type Name="std::mutex">
    <DisplayString>mutex</DisplayString>
    <Expand>
      <ExpandedItem>(_Mutex_base*)this</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="std::timed_mutex">
    <DisplayString>timed_mutex</DisplayString>
    <Expand>
      <Item Name="[locked]">_My_locked</Item>
    </Expand>
  </Type>
  <Type Name="std::recursive_mutex">
    <DisplayString>recursive_mutex</DisplayString>
    <Expand>
      <ExpandedItem>(_Mutex_base*)this</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="std::recursive_timed_mutex">
    <DisplayString>recursive_timed_mutex</DisplayString>
    <Expand>
      <Item Name="[locked]">_My_locked</Item>
      <Item Name="[owner]">_My_owner</Item>
    </Expand>
  </Type>
</AutoVisualizer> 

0
使用 Visual Studio 2019:
如果你在使用 std::mutex 时遇到了死锁问题。可以展开外部的代码并跳转到调用栈中的 mtx_do_lock() 函数(通常在用户代码的上三层),然后将鼠标悬停在 mtx 参数上。这将显示其正在等待的线程 ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接