2015-01-09 19 views
1

我試圖在Windows性能分析器(WPA)(在Windows 8.1下)顯示線程的名稱。這個工具有一個名爲「線程名稱」的列。如何在Windows性能分析器中命名一個線程?

我跟着著名的MSDN文章:

http://msdn.microsoft.com/en-us/library/xcb2z8hs(v=vs.110).aspx

然而,看起來不WPA工作。根據第三方文檔,只有Microsoft的Visual Studio和WinDbg調試器支持此異常。

那麼如何命名一個線程,使其名稱可以在WPA中顯示?

回答

-1

不要有WPA安裝方便所以不能回答您的查詢,但感謝 它永遠不會發生,我認爲這可能是使用本地代碼的問題太 可以派上用場

#include <windows.h> 
#include <stdio.h> 
const DWORD MS_VC_EXCEPTION=0x406D1388; 
//EmptyBlock,Constant in__except() and lpparam not used in ThreadProc 
#pragma warning(disable : 6312 6322 4100) 
#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) 
DWORD WINAPI ThreadProc(LPVOID lpParam) { 
    int ch = 0; while(ch != 'y') { ch = getchar(); } return 0;} 
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_CONTINUE_EXECUTION) { } 
} 
void main (void) { 
    HANDLE hThread = NULL; 
    printf("\n\n\n=======Creating Thread And Naming It================\n\n\n"); 
    if ((hThread = CreateThread(NULL,NULL,ThreadProc,NULL,NULL,NULL)) != NULL) { 
     SetThreadName(GetCurrentThreadId(), "\n\nMy New Shiny Thread\n\n"); 
     WaitForSingleObject(hThread,INFINITE); 
     printf("Named Thread Terminated Main is terminating\n"); 
     CloseHandle(hThread); 
    } 
} 

編譯的鏈接和windbagged VCPP事件似乎在WinDbg中 奇蹟來處理這個異常是什麼魔力雙字dbce處理

dir /b 
compile.bat 
threadname.cpp 

type compile.bat 
@call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 
cl /Zi /nologo /W4 /analyze *.cpp /link /RELEASE 

compile.bat 
Setting environment for using Microsoft Visual Studio 2010 x86 tools. 
threadname.cpp 

dir /b *.exe 
threadname.exe 

cdb -c "sxe -c \"~*;gc;\" vcpp;g;q" threadname.exe 

0:000> cdb: Reading initial command 'sxe -c "~*;gc;" vcpp;g;q' 


=================Creating Thread And Naming It=================== 


(f84.db4): Visual C++ exception - code 406d1388 (first chance) 
. 0 Id: f84.db4 Suspend: 1 Teb: 7ffdf000 Unfrozen " 

My New Shiny Thread 

" 
     Start: threadname!mainCRTStartup (00401642) 
     Priority: 0 Priority class: 32 Affinity: 1 
y 
Named Thread Terminated Main is terminating 
quit: