代码之家  ›  专栏  ›  技术社区  ›  VitalyB

在Visual Studio 2010扩展包下运行时重命名一个C++线程

  •  1
  • VitalyB  · 技术社区  · 14 年前

    我使用下面的代码(从MSDN)重命名C++线程:

    #include <windows.h>
    const DWORD MS_VC_EXCEPTION=0x406D1388;
    
    #pragma pack(push,8)
    typedef struct tagTHREADNAME_INFO
    {
       DWORD dwType; // Must be 0x1000.
       LPCSTR szName; // Pointer to name (in user addr space).
       DWORD dwThreadID; // Thread ID (-1=caller thread).
       DWORD dwFlags; // Reserved for future use, must be zero.
    } THREADNAME_INFO;
    #pragma pack(pop)
    
    void SetThreadName( DWORD dwThreadID, char* threadName)
    {
       THREADNAME_INFO info;
       info.dwType = 0x1000;
       info.szName = threadName;
       info.dwThreadID = dwThreadID;
       info.dwFlags = 0;
    
       __try
       {
          RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
       }
       __except(EXCEPTION_EXECUTE_HANDLER)
       {
       }
    }
    

    总体来说效果很好。但是,当尝试在Visual Studio(2010)扩展包中执行此代码时,我得到以下未散列的异常,并且线程的名称不会更改:

    发生System.Runtime.InteropServices.SehException 消息:外部组件引发了异常。

    有人知道那里发生了什么事吗?我意识到从扩展中以这种方式更改线程可能会有一些问题,但是,它是未记录的,而且从标准的外接程序看来工作正常。

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  2
  •   Praetorian Luchian Grigore    14 年前

    我不确定这是否是你问题的原因,但根据 this msdn文档 SetThreadName 函数仅适用于本机代码。从你看到的例外情况来看,你正在编译 /clr 选项,因此您可能应该使用与此等效的托管代码。按照下面的链接 另请参见 在第一个链接的部分中,它显示了用于托管代码的代码段。

    HTH 灰白的。

        2
  •  1
  •   dripfeed    14 年前

    听起来很熟悉。这是我们的内部 SetThreadName 看起来像(在混合的原生C++,c++/CLI,c++ app):

    #pragma warning(disable: 6312 6322)
            __try
            {
                RaiseException( 0x406D1388, 0, sizeof(info) / sizeof(DWORD), (DWORD*)&info );
            }
            // don't implement MSDN's suggested fix for 6312 here - it causes a nasty unhandled exception
            // to bubble up into managed code. Disable the compiler warning instead.
            __except(EXCEPTION_CONTINUE_EXECUTION)
            {
            }
    #pragma warning(default: 6312 6322)