因此,根据Visual Studio,我应该在没有运行283个线程的应用程序中修复没有事件探查器的死锁(至少我没有找到任何有用的死锁)。大多数线程称为Thread _threadstartexThread _threadstartex,这使得很难查看它们的所属对象。



因此,我决定第一步就是要找到线程的起始位置并为其设置一些名称,以便区分boostQt内部线程以及我们的应用程序线程。

因此,问题是(万一有人忘记了标题):如何找到在Visual Studio中启动的线程所在的FILE和LINE NUMBER?

最佳答案

几年前,我曾在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 CodeHow to: Set a Thread Name in Managed Code

也许Visual Studio 2015具有一些更好的调试功能,可能对您有帮助? Microsoft已实现了许多增强功能,但是我不确定其中任何一项可以帮助您解决问题。

关于c++ - 查找线程在Visual Studio 2010 C++中从何处开始,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33302063/

10-11 22:36
查看更多