如何使用 windbg 检查堆转储中静态 thread_local 变量的内容?

How can I inspect the contents of a static thread_local variable on a heap dump with windbg?

给定以下源代码:

namespace EventThreadLocal {

  static thread_local std::unique_ptr<std::vector<EventInfo>> Stack;

  static const EventInfo* Top()
  {
    auto stack = Stack.get();
    if (!stack)
      return nullptr;
    if (stack->empty())
      return nullptr;

    return &(stack->back());
  }
}

如何检查堆转储中静态 thread_local 变量 Stack 的内容?

我的理解是命令 !tls 显示线程本地存储槽,但我怎么知道这个变量使用的适当槽索引?

您不需要知道与 static thread_local 变量关联的 TLS 插槽,调试器已经使用 x 命令解决了该问题。请参阅下面的示例输出,xStack 解析为 WinDbg 中不同线程的不同地址。

0:000> x test_exe!Stack
00000296`a5437410 test_exe!Stack = empty
0:000>~1s
0:001> x test_exe!stack
00000296`a543e230 test_exe!Stack = empty