所以我应该在没有探查器的情况下修复死锁(至少我没有找到任何有用的死锁),根据VisualStudio运行不可浏览的283个线程的应用程序。大多数线程都被称为Thread _threadstartexThread _threadstartex
,因此很难看出它们属于什么。
因此我决定我的第一步是找到线程的起始位置并为它们设置一些名称,这样我就可以区分boost
和Qt
内部线程和我们的应用程序线程。
因此问题是(如果有人忘记了标题):如何找到在Visual Studio中看到的线程开始的文件和行号?
答案 0 :(得分:1)
多年前,我曾经在Microsoft TechEd上了解到,当Visual Studio是您的调试器时,您可以设置线程名称。要在您的程序中调用的代码是:
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; // must be 0x1000
LPCSTR szName; // pointer to name (in user addr space), UTF-8
DWORD dwThreadID; // thread ID (-1=caller thread)
DWORD dwFlags; // reserved for future use, must be zero
} THREADNAME_INFO;
void SetThreadName(DWORD dwThreadID, LPCSTR szThreadName)
{
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = szThreadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
#pragma warning(push)
#pragma warning(disable: 6312) // Possible infinite loop: use of the constant EXCEPTION_CONTINUE_EXECUTION in the exception-filter expression of a try-except. Execution restarts in the protected block
#pragma warning(disable: 6322) // Empty _except block
__try {
RaiseException(0x406D1388, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info);
}
__except (EXCEPTION_CONTINUE_EXECUTION) {
}
#pragma warning(pop)
}
参考文献:MSDN How to: Set a Thread Name in Native Code和How to: Set a Thread Name in Managed Code。
也许Visual Studio 2015有一些更好的调试工具可以帮到你? Microsoft已经实现了许多增强功能,但我不确定其中一个会帮助您解决问题。