在Windows小型转储文件中嵌入线程名称 我们的32位C++应用程序使用它的名称命名它的线程。当出现错误时,我们会生成迷你转储,但当转储加载到Visual Studio 2013中时,线程名称将丢失。鉴于存在大量线程,这使得调试问题变得更加困难

在Windows小型转储文件中嵌入线程名称 我们的32位C++应用程序使用它的名称命名它的线程。当出现错误时,我们会生成迷你转储,但当转储加载到Visual Studio 2013中时,线程名称将丢失。鉴于存在大量线程,这使得调试问题变得更加困难,c++,visual-studio,minidump,google-breakpad,C++,Visual Studio,Minidump,Google Breakpad,我听说的唯一改进方法就是这样,调用方建议将它们嵌入到自定义流中,并编写自定义Visual Studio扩展以在加载转储时重命名线程。然而,这看起来很麻烦,而且显然为加载过程增加了很多时间 是否有更简单的方法将线程名称嵌入转储,以便在VisualStudio中加载线程时“正常工作” 仅供参考:我们使用Visual Studio 2013进行构建,我们的应用程序在Win7或更高版本上运行,我们使用Google Breakpad生成转储 在进一步挖掘之后,一种方法似乎是将指向该名称的指针存储在线程的T

我听说的唯一改进方法就是这样,调用方建议将它们嵌入到自定义流中,并编写自定义Visual Studio扩展以在加载转储时重命名线程。然而,这看起来很麻烦,而且显然为加载过程增加了很多时间

是否有更简单的方法将线程名称嵌入转储,以便在VisualStudio中加载线程时“正常工作”


仅供参考:我们使用Visual Studio 2013进行构建,我们的应用程序在Win7或更高版本上运行,我们使用Google Breakpad生成转储

在进一步挖掘之后,一种方法似乎是将指向该名称的指针存储在线程的TEB的ArbitraryUserPointer字段中

如果TEB随后被嵌入到minidump中(根据,这可以通过MiniDumpWithProcessThreadData标志实现),那么看起来至少我们可以通过计算

(*(char **)(@TIB+0x14))

也许可以编写一个Visual Studio调试器加载项,以便在附加进程时检查TEB的内容,并使用异常“hack”在“线程”窗口中设置线程的名称。

Microsoft已表示,该加载项将是他们将来为转储、调试器和,和/或分析工具


不幸的是,这个API似乎是相当新的,在dumps、WinDbg、visualstudio调试器等中还不受支持。确实存在,所以如果您希望找到一种方法正确地为线程指定一个持久名称,请投票支持它。

线程没有名称。有一种方法是故意抛出一个调试器拦截的异常。是的,我知道这是一种仅在调试器中支持的黑客行为。我们一直在寻找一种方法,以类似的简单和一致的方式“命名”线程,同时将这些信息保存到迷你转储中,然后在加载时恢复。@HansPassant“线程没有名称”是一个非常失败的答案。线程没有名称,因为尚未提供用于命名它们的健壮API。线程可以有名称,线程应该有名称。他们没有命名并不是因为自然规律,只是因为还没有写出这一特征。更新:@KayceeAnderson在微软提到,有一些关于线程命名的新方法的工作正在进行中。WinDbg现在通过SetThreadDescription()支持这一点。详细信息请参见此答案:嗯,情节变厚了,即使表明是这样,至少对WinNT来说,他们似乎不太可能通过让操作系统覆盖来破坏现有的32位应用程序。但我想,所有的赌注都押在x64上了,这可能就是为什么在winternl.h.Update中找到的PEB结构定义中不再调用它的原因:即将到来的WinDbg版本现在支持在迷你转储中显示通过SetThreadDescriptionAPI设置的线程名称。有关详细信息,请参见此链接:更新:Visual Studio 2017 v15.3现在显示通过SetThreadDescription API为调试器中启动的进程设置的线程名称(但尚不支持在调试转储文件时显示这些名称)。minidump格式现在支持线程名称,但是我很难找到所用格式的文档。我需要这个crashpad,它手动写入迷你转储文件。请参阅@BruceDawson我与微软就此事进行了交谈。他们说,在最新版本的minidumpapiset.h标头中,有一个名为ThreadNamesStream的流类型,它对应于在名为
MINIDUMP\u THREAD\u NAME\u LIST
的同一标头中定义的结构,其ThreadNames数组成员的值为:
typedef struct\u MINIDUMP\u THREAD\u NAME{ULONG ThreadId;RVA64 RvaOfThreadName;}MINIDUMP_THREAD_NAME,*PMINIDUMP_THREAD_NAME;
其中
ThreadId
对应于线程的TID,
RvaOfThreadName
是包含该名称的转储中的虚拟内存地址。感谢您的帮助。我在