簡體   English   中英

如何在 Visual Studio 中查看 std::mutex 的鎖定線程?

[英]How to see locking thread of std::mutex in Visual Studio?

使用 Windows CRITICAL_SECTION ,我可以通過擴展變量看到鎖定它的線程:

在此處輸入圖像描述

但是,我似乎不能對std::mutex做同樣的事情,而是得到很多無用的值:

在此處輸入圖像描述

有沒有不需要修改我的代碼的方法?

感謝@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> 

使用視覺工作室 2019:

如果您發現自己使用 std::mutex 處於鎖定狀態。 顯示外部代碼並轉到...調用堆棧中的 mtx_do_lock()(可能從用戶代碼調用 3 個),然后將鼠標懸停在 mtx 參數上。 這將顯示它正在等待的擁有線程 ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM