【问题标题】:Find where a thread started in Visual Studio 2010 C++在 Visual Studio 2010 C++ 中查找线程开始的位置
【发布时间】:2015-10-23 12:13:50
【问题描述】:

因此,根据 VisualStudio,我应该在运行令人难以置信的 283 个线程的应用程序中修复一个没有分析器的死锁(至少我没有找到任何有用的)。大多数线程都称为Thread _threadstartexThread _threadstartex,因此很难看出它们属于什么。

因此我决定我的第一步是找到线程的启动位置并为它们设置一些名称,这样我就可以区分boostQt内部线程和我们的应用程序线程。

因此问题是(以防有人忘记标题):如何找到在 Visual Studio 中看到的线程开始的 FILE 和 LINE NUMBER?

【问题讨论】:

    标签: c++ multithreading visual-studio-2010 debugging


    【解决方案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 CodeHow to: Set a Thread Name in Managed Code

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

    【讨论】:

    • 是的,我刚开始以跨平台的方式编写这个(例如,很多 ifdefs)。但我的问题是如何找到线程开始的位置,以便我可以编辑该代码以将名称设置为线程。例如。哪个文件创建了线程。这也是我在问题标题中写的。
    • @TomášZato 查找您开始线程的所有位置,并将线程的名称设置为包含当前 __FILE__ 和 __LINE__ 的名称。如果幸运的话,您可以使用宏来帮助您创建一个包装器,为您创造奇迹。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多