在Windows迷你转储文件中嵌入线程名称

Embedding thread names in Windows minidump files

本文关键字:线程 文件 Windows 转储      更新时间:2023-10-16

我们的32位c++应用程序使用Windows上的标准方法命名其线程。当错误发生时,我们生成迷你转储,但是当转储加载到Visual Studio 2013中时,线程名就丢失了。在存在大量线程的情况下,这使得调试问题变得更加困难。

我听说过的唯一改进方法来自Microsoft User Voice的帖子,其中调用者建议将它们嵌入到自定义流中,并编写自定义Visual Studio扩展以在加载转储时重命名线程。然而,这似乎很麻烦,而且显然增加了加载过程的大量时间。

是否有一种更简单的方法来嵌入线程名称在转储,使他们"只是工作"时加载他们在Visual Studio?

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

微软已经表示SetThreadDescription API将是他们将来在转储、调试器和/或分析工具中添加线程名称的任何适当支持的基础。

不幸的是,这个API看起来很新,在dumps、WinDbg、Visual Studio Debugger等中还不支持。有一个用户声音请求添加这个支持,所以如果你想要一个合适的方法给线程一个持久的名字,请投票支持它。

在深入研究之后,似乎有一种方法是在线程的TEB的ArbitraryUserPointer字段中存储指向该名称的指针。

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

在Visual Studio监视窗口中查看当前线程名称
(*(char **)(@TIB+0x14))

也许可以编写一个Visual Studio调试器插件来检查附加到进程的TEB的内容,并使用异常'hack'在Threads窗口中设置线程的名称。