2

我们的 32 位 C++ 应用程序使用Windows 上的标准方法命名其线程。当发生错误时,我们会生成小型转储,但是当转储加载到 Visual Studio 2013 时,线程名称会丢失。鉴于存在大量线程,这使得调试问题变得更加困难。

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

是否有一种更简单的方法可以将线程名称嵌入转储中,以便在 Visual Studio 中加载它们时“正常工作”?

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

4

2 回答 2

3

Microsoft 表示,SetThreadDescription API将成为他们将来为转储、调试器和/或分析工具中的线程名称添加的任何适当支持的基础。

不幸的是,这个 API 似乎是相当新的,并且在转储、WinDbg、Visual Studio 调试器等中尚不支持。有一个用户语音请求添加此支持,所以如果你想正确地给予它,请投票给它线程一个持久的名称。

于 2017-01-03T15:07:40.160 回答
0

经过更多的挖掘,似乎一种方法是将指向名称的指针存储在线程 TEB 的 ArbitraryUserPointer 字段中。

如果随后将 TEB 嵌入到 minidump 中(根据这篇文章,可以使用 MiniDumpWithProcessThreadData 标志来实现),那么看起来至少我们可以通过评估在 Visual Studio 监视窗口中查看当前线程名称

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

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

于 2014-08-06T14:34:12.323 回答