2009-05-25 2 views
15

어떻게 이름을 Win32 스레드로 설정합니까? 나는 동일한 Win32 API를 찾지 못했습니다. 기본적으로 로그 파일에 스레드 이름을 추가하려고합니다. TLS (Thread Local Storage)가이를 수행하는 유일한 방법입니까?이름을 Win32 스레드로 설정하는 방법은 무엇입니까?

+0

SetThreadDescription() API는 다음과 같습니다 당신은 WinDbg는, 비주얼 스튜디오, 그리고 크래시 덤프 파일로이 이득 더 나은 지원을 참조하려는 경우

,이 링크를 사용하여 투표하십시오 앞으로 Microsoft는이를 지원할 API를 개발할 계획입니다. 자세한 내용은이 답변을 참조하십시오 : http://stackoverflow.com/a/43787005/434413 –

답변

1

이 정보는 사용자가 직접 적절한 데이터 구조에 저장할 수 있습니다. 해시 또는 맵을 사용하여 GetThreadId()를이 이름에 매핑하십시오. GetThreadId()는 항상 고유 한 식별자이므로 정상적으로 작동합니다.

건배! 그는 많은 스레드를 생성 않다면 물론

, 그 해시 맵은 천천히 을 작성하고 더 많은 메모리, 그래서 일부 정리 절차뿐만 아니라 아마 좋은 일이 사용합니다.

당신이 옳습니다. 쓰레드가 죽을 때 맵의 대응하는 엔트리가 자연스럽게 제거되어야합니다.

+0

물론 많은 스레드를 생성하는 경우 해시 맵이 서서히 채워지고 더 많은 메모리가 사용되므로 정리 절차가 좋은 것일 수 있습니다. –

+0

downvoting 너무이 질문에 대한 답변이 필요하기 때문에 실제로 프로파일 링 이유로 스레드에 이름을 설정해야합니다. 당신의 대답은 묻는 질문에 대답하지 않습니다 : P –

29

이 정보가 도움이 되나요? How to: Set a Thread Name in Native Code

관리 코드에서 해당 Thread 개체의 Name 속성을 설정하는 것만 큼 쉽습니다.

+1

Visual Studio 디버거가 스레드 이름을 표시하는 것으로 만 추측 할 수 있습니다. – Canopus

+1

다른 디버거도 같은 시그널을 따르고 응답했습니다. –

+3

http://thetweaker.wordpress.com/2009/04/10/naming-threads/ 노트와 같이 디버거 데이터 구조에 스레드 이름을 저장하여 디버거가 모두 수행합니다 . Ergo, 디버거 없이는 이름이 저장되지 않으며 로깅 목적으로는 사용할 수 없습니다. 불쾌한 버그 : 디버깅하려고 할 때 갑자기 다시 작동합니다. – MSalters

1

디버거 (windbg를 또는 Visual Studio)에서 스레드의 이름을보고 싶다면 : http://blogs.msdn.com/stevejs/archive/2005/12/19/505815.aspx

난 사실 잘 모르겠어요 스레드 이름을 얻을 수있는 역 방법이 있다면. 그러나 TLS는 갈 길과 같이 들립니다.

+0

당신은 잘못된 인상을 받았습니다. 스레드의 이름은 ** 스레드에 저장되지 않습니다 **. 디버거에만 저장되므로 결과적으로 디버거가 연결될 때만 존재합니다. 디버거가 없으면 예외는 단순히 아무 일도 일어나지 않은 것처럼 계속되는 다음 예외 필터로 실행됩니다. 응용 프로그램이 디버거에서 실행되지 않으면 스레드 이름이 손실됩니다. – IInspectable

17

http://msdn.microsoft.com/en-us/library/xcb2z8hs(VS.90).aspx

// 
// 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) 
    { 
    } 
} 
+0

디버거에서 코드를 실행하지 않으면이 기능이 작동하지 않습니다. 실제 시스템에서는 스레드의 이름을 기록하는 데 사용할 수 없습니다. – IInspectable

9

는 Win32 스레드 이름이 없습니다. 응용 프로그램이 스레드 이름을 포함하는 특수 SEH 예외를 발생시키는 Microsoft 규칙이 있습니다. 이러한 예외는 디버거에 의해 가로 챌 수 있으며 스레드 이름을 나타내는 데 사용됩니다. 몇 가지 답변이 그 내용을 담고 있습니다.

그러나 디버거에서 모두 처리합니다. 쓰레드 자체는 이름이없는 객체입니다. 따라서 스레드와 이름을 연결하려면 고유 한 메커니즘을 개발해야합니다. 스레드 로컬 저장소는 스레드에서 실행되는 코드에서만 이름을 얻을 수 있도록 허용합니다. 따라서 스레드 ID와 이름 사이의 글로벌 맵은 가장 자연스럽고 유용한 접근 방식처럼 보일 것입니다.

1

또 다른 방법은 스레드의 TEB에있는 ArbitraryUserPointer 필드에 이름에 대한 포인터를 저장하는 것입니다. 이것은 런타임에 쓰고 읽을 수 있습니다.

여기에 CodeProject라는 제목의 "Debugging With The Thread Information Block" 문서가 있습니다.

3

스레드 로컬 저장소 개체를 사용하여 이름을 저장할 수 있습니다. 예 :

__declspec(thread) char threadName[32]; 

그런 다음 스레드에서 읽고 쓸 수 있습니다. 이 기능은 모든 메시지에 대한 스레드 이름을 인쇄하려는 로거 응용 프로그램에서 유용 할 수 있습니다. 스레드가 시작하자마자이 변수를 쓰고 디버거도 스레드 이름을 알 수 있도록 Microsoft 예외 (https://stackoverflow.com/a/10364541/364818)를 던져야합니다.

2

Microsoft 디버깅 팀 리드 (자세한 내용은 아래 링크 참조)에 따르면 SetThreadDescription API는 Microsoft에서 공식적으로 네이티브 코드에서 스레드 명명을 지원하기 위해 사용할 API입니다. "공식적으로"말하자면, 현재 예외가 발생하는 해킹이 아니라 Visual Studio에서 프로세스가 실행 중일 때만 작동하는 MS- 지원 API입니다.

이 API

는 1607

는 현재, 그러나 아주 작은 도구의 지원이있다, 그래서 당신이 설정 한 이름은 비주얼 스튜디오 나 WinDbg는 디버거에 표시되지 않습니다 버전, 윈도우 10부터 사용 가능하게되었다. 그러나 2017 년 4 월 현재 Microsoft xperf/WPA 도구가이를 지원합니다 (이 API를 통해 명명 된 스레드의 이름은 해당 도구에 올바르게 표시됩니다).

https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/17608120-properly-support-native-thread-naming-via-the-sett

+0

업데이트 : Windows 성능 분석기 및 WinDbg 빌드가 이제 SetThreadDescriptionAPI를 통해 설정된 스레드 이름 표시를 지원합니다. https://blogs.msdn.microsoft.com/windbg/2017/06/29/debugger-updates-in-the-16225-sdk-preview/ –

관련 문제