Click to Rate and Give Feedback
MSDN
MSDN Library
Visual Studio 2010
Visual Studio
Debugger Roadmap
 How to: Set a Thread Name in Native...
Collapse All/Expand All Collapse All
Visual Studio Debugger
How to: Set a Thread Name in Native Code

This topic applies to:

Edition

Visual Basic

C#

F#

C++

Web Developer

Express

Topic does not applyTopic does not apply

Topic does not apply

Native only

Topic does not apply

Pro, Premium, and Ultimate

Topic does not apply

Topic does not apply

Topic does not apply

Native only

Topic does not apply

To set a thread name in your program, use the SetThreadName function, as shown in the following code example. Note that the thread name is copied to the thread so that the memory for the threadName parameter can be released.

//
// Usage: SetThreadName (-1, "MainThread");
//
#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)
   {
   }
}
Tags What's this?: Add a tag
Community Content   What is Community Content?
Add new content RSS  Annotations
Slight variation      steveren   |   Edit   |   Show History
I've been using EXCEPTION_CONTINUE_EXECUTION, not EXCEPTION_EXECUTE_HANDLER, for years now. It seems to work perfectly, and whether coincidence or not, I've not seen the previous commenter's problem with needing a debugger active.
Tags What's this?: Add a tag
Flag as ContentBug
Note: Don't use outside debugger      Bengt Gustafsson   |   Edit   |   Show History
For this to work in general you need to check ::IsDebuggerPresent() before throwing the exception. For some reason the runtime doesn't like to see that exception thrown outside a debugger.

Furthermore there are tools like profilers (for instance AQTime) which act as debuggers but don't allow the throw anyway. A command line option to your app can be used to turn on or off the thread naming call.
Tags What's this?: Add a tag
Flag as ContentBug
Processing
© 2012 Microsoft. All rights reserved. Terms of Use | Trademarks | Privacy Statement
Page view tracker