我们的32位C ++应用程序使用standard approach on Windows命名其线程。我们在发生错误时生成小型转储,但是当转储加载到Visual Studio 2013时,缺少线程名称。考虑到存在大量线程,这使得调试问题变得更加困难。
我听说过改进的唯一方法来自于此Microsoft User Voice posting,其中调用方建议将它们嵌入到自定义流中,并编写自定义Visual Studio扩展以在加载时重命名线程倾倒。然而,这看起来很麻烦,显然会给装载过程增加很多时间。
是否有一种更简单的方法可以在转储中嵌入线程名称,以便它们能够正常运行"在Visual Studio中加载它们时?
供参考:我们使用Visual Studio 2013构建,我们的应用程序在Win7或更高版本上运行,我们使用Google Breakpad生成转储。
答案 0 :(得分:1)
Microsoft表示SetThreadDescription API将成为他们将来为转储,调试器和/或分析工具中的线程名称添加的任何适当支持的基础。
不幸的是,这个API似乎是新的,在转储,WinDbg,Visual Studio Debugger等中尚不支持。有a User Voice request to add this support,所以如果你想要一种正确的方法,请投票给它线程持久名称。
答案 1 :(得分:0)
经过一些挖掘之后,似乎有一种方法是在线程的TEB的ArbitraryUserPointer字段中存储指向名称的指针。
如果然后将TEB嵌入到minidump中(可以使用MiniDumpWithProcessThreadData标志实现,根据this article)那么我们至少可以在Visual Studio监视器中查看当前的线程名称窗口评估
(*(char **)(@TIB+0x14))
也许可以编写Visual Studio调试器加载项来在附加进程时检查TEB的内容,并使用异常“hack”在“线程”窗口中设置线程的名称。