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

Posted

技术标签:

【中文标题】如何使用 windbg 检查堆转储上的静态 thread_local 变量的内容?【英文标题】:How can I inspect the contents of a static thread_local variable on a heap dump with windbg? 【发布时间】:2020-12-16 01:03:55 【问题描述】:

给出以下源代码:

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 显示线程本地存储槽,但是我怎么知道这个变量使用的适当槽索引呢?

【问题讨论】:

【参考方案1】:

您不需要知道与 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

【讨论】:

以上是关于如何使用 windbg 检查堆转储上的静态 thread_local 变量的内容?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 WinDbg 中加载 SOS

如何使用 WinDbg 分析 VC++ 应用程序的故障转储?

在 OQL 的堆转储中获取类的静态字段

!堆失败。 ntdll!_HEAP_ENTRY 的类型信息无效

为啥 windbg> !EEHeap -gc 显示的托管堆比 VMMAP.exe 小得多?

WinDBG:来自 WinForms 应用程序的内存转储 - 如何获取文本框的值