在Windows迷你转储文件中嵌入线程名称
Embedding thread names in Windows minidump files
我们的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窗口中设置线程的名称。
- boost::文件系统::recursive_directory_iterator多线程安全
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- 在C++中写入来自不同线程的文件
- 线程 1 从文件读取,就像线程 2 写入同一文件一样
- 多个线程/进程是否可以在不同步的情况下同时从/写入文件的非重叠区域?
- 多线程和共享资源:使用C++定期将数据从缓冲区(数据结构)复制到文件
- C++中的多线程文件哈希
- C++:如何在线程中读取二进制文件并将其写入另一个线程?
- 在Qt中使用工作线程将数据写入文件的正确方法是什么?
- 我们是否需要互斥锁来执行多线程文件 IO
- Borland C++ 5.02 中使用第三方头文件的多线程
- 多线程文件 IO 程序在线程数增加时行为不可预测
- 多线程文件读取为每个线程生成相同的结果
- 多线程文件读取
- 多线程文件保存操作
- 如何在C++中实现多线程文件处理
- 用于从本地PC接收文件的简单服务器线程-文件暂时为空
- 在c++中实现高效多线程文件I/O
- 多线程文件流
- 使用c++将多线程文件复制到不同的硬盘驱动器