mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-30 01:04:36 +00:00
Dynamically load Get/SetThreadDescription.
This commit is contained in:
parent
fc11537e12
commit
69c5e667ae
@ -86,9 +86,38 @@ struct StackWalkEvent
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __CYGWIN__
|
#ifdef __CYGWIN__
|
||||||
|
extern "C" typedef DWORD (WINAPI *t_GetProcessIdOfThread)( HANDLE );
|
||||||
|
extern "C" typedef DWORD (WINAPI *t_GetProcessImageFileNameA)( HANDLE, LPSTR, DWORD );
|
||||||
extern "C" ULONG WMIAPI TraceSetInformation(TRACEHANDLE SessionHandle, TRACE_INFO_CLASS InformationClass, PVOID TraceInformation, ULONG InformationLength);
|
extern "C" ULONG WMIAPI TraceSetInformation(TRACEHANDLE SessionHandle, TRACE_INFO_CLASS InformationClass, PVOID TraceInformation, ULONG InformationLength);
|
||||||
|
# ifdef UNICODE
|
||||||
|
t_GetProcessIdOfThread GetProcessIdOfThread = (t_GetProcessIdOfThread)GetProcAddress( GetModuleHandle( L"kernel32.dll" ), "GetProcessIdOfThread" );
|
||||||
|
t_GetProcessImageFileNameA GetProcessImageFileNameA = (t_GetProcessImageFileNameA)GetProcAddress( GetModuleHandle( L"kernel32.dll" ), "K32GetProcessImageFileNameA" );
|
||||||
|
# else
|
||||||
|
t_GetProcessIdOfThread GetProcessIdOfThread = (t_GetProcessIdOfThread)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "GetProcessIdOfThread" );
|
||||||
|
t_GetProcessImageFileNameA GetProcessImageFileNameA = (t_GetProcessImageFileNameA)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "K32GetProcessImageFileNameA" );
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern "C" typedef NTSTATUS (WINAPI *t_NtQueryInformationThread)( HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG );
|
||||||
|
extern "C" typedef BOOL (WINAPI *t_EnumProcessModules)( HANDLE, HMODULE*, DWORD, LPDWORD );
|
||||||
|
extern "C" typedef BOOL (WINAPI *t_GetModuleInformation)( HANDLE, HMODULE, LPMODULEINFO, DWORD );
|
||||||
|
extern "C" typedef DWORD (WINAPI *t_GetModuleBaseNameA)( HANDLE, HMODULE, LPSTR, DWORD );
|
||||||
|
extern "C" typedef HRESULT (WINAPI *t_GetThreadDescription)( HANDLE, PWSTR* );
|
||||||
|
#ifdef UNICODE
|
||||||
|
t_NtQueryInformationThread NtQueryInformationThread = (t_NtQueryInformationThread)GetProcAddress( GetModuleHandle( L"ntdll.dll" ), "NtQueryInformationThread" );
|
||||||
|
t_EnumProcessModules _EnumProcessModules = (t_EnumProcessModules)GetProcAddress( GetModuleHandle( L"kernel32.dll" ), "K32EnumProcessModules" );
|
||||||
|
t_GetModuleInformation _GetModuleInformation = (t_GetModuleInformation)GetProcAddress( GetModuleHandle( L"kernel32.dll" ), "K32GetModuleInformation" );
|
||||||
|
t_GetModuleBaseNameA _GetModuleBaseNameA = (t_GetModuleBaseNameA)GetProcAddress( GetModuleHandle( L"kernel32.dll" ), "K32GetModuleBaseNameA" );
|
||||||
|
#else
|
||||||
|
t_NtQueryInformationThread NtQueryInformationThread = (t_NtQueryInformationThread)GetProcAddress( GetModuleHandle( "ntdll.dll" ), "NtQueryInformationThread" );
|
||||||
|
t_EnumProcessModules _EnumProcessModules = (t_EnumProcessModules)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "K32EnumProcessModules" );
|
||||||
|
t_GetModuleInformation _GetModuleInformation = (t_GetModuleInformation)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "K32GetModuleInformation" );
|
||||||
|
t_GetModuleBaseNameA _GetModuleBaseNameA = (t_GetModuleBaseNameA)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "K32GetModuleBaseNameA" );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static t_GetThreadDescription _GetThreadDescription = 0;
|
||||||
|
|
||||||
|
|
||||||
void WINAPI EventRecordCallback( PEVENT_RECORD record )
|
void WINAPI EventRecordCallback( PEVENT_RECORD record )
|
||||||
{
|
{
|
||||||
#ifdef TRACY_ON_DEMAND
|
#ifdef TRACY_ON_DEMAND
|
||||||
@ -165,6 +194,8 @@ void WINAPI EventRecordCallback( PEVENT_RECORD record )
|
|||||||
|
|
||||||
bool SysTraceStart( int64_t& samplingPeriod )
|
bool SysTraceStart( int64_t& samplingPeriod )
|
||||||
{
|
{
|
||||||
|
if( !_GetThreadDescription ) _GetThreadDescription = (t_GetThreadDescription)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "GetThreadDescription" );
|
||||||
|
|
||||||
s_pid = GetCurrentProcessId();
|
s_pid = GetCurrentProcessId();
|
||||||
|
|
||||||
#if defined _WIN64
|
#if defined _WIN64
|
||||||
@ -281,35 +312,6 @@ void SysTraceWorker( void* ptr )
|
|||||||
tracy_free( s_prop );
|
tracy_free( s_prop );
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __CYGWIN__
|
|
||||||
extern "C" typedef DWORD (WINAPI *t_GetProcessIdOfThread)( HANDLE );
|
|
||||||
extern "C" typedef DWORD (WINAPI *t_GetProcessImageFileNameA)( HANDLE, LPSTR, DWORD );
|
|
||||||
# ifdef UNICODE
|
|
||||||
t_GetProcessIdOfThread GetProcessIdOfThread = (t_GetProcessIdOfThread)GetProcAddress( GetModuleHandle( L"kernel32.dll" ), "GetProcessIdOfThread" );
|
|
||||||
t_GetProcessImageFileNameA GetProcessImageFileNameA = (t_GetProcessImageFileNameA)GetProcAddress( GetModuleHandle( L"kernel32.dll" ), "K32GetProcessImageFileNameA" );
|
|
||||||
# else
|
|
||||||
t_GetProcessIdOfThread GetProcessIdOfThread = (t_GetProcessIdOfThread)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "GetProcessIdOfThread" );
|
|
||||||
t_GetProcessImageFileNameA GetProcessImageFileNameA = (t_GetProcessImageFileNameA)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "K32GetProcessImageFileNameA" );
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern "C" typedef NTSTATUS (WINAPI *t_NtQueryInformationThread)( HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG );
|
|
||||||
extern "C" typedef BOOL (WINAPI *t_EnumProcessModules)( HANDLE, HMODULE*, DWORD, LPDWORD );
|
|
||||||
extern "C" typedef BOOL (WINAPI *t_GetModuleInformation)( HANDLE, HMODULE, LPMODULEINFO, DWORD );
|
|
||||||
extern "C" typedef DWORD (WINAPI *t_GetModuleBaseNameA)( HANDLE, HMODULE, LPSTR, DWORD );
|
|
||||||
#ifdef UNICODE
|
|
||||||
t_NtQueryInformationThread NtQueryInformationThread = (t_NtQueryInformationThread)GetProcAddress( GetModuleHandle( L"ntdll.dll" ), "NtQueryInformationThread" );
|
|
||||||
t_EnumProcessModules _EnumProcessModules = (t_EnumProcessModules)GetProcAddress( GetModuleHandle( L"kernel32.dll" ), "K32EnumProcessModules" );
|
|
||||||
t_GetModuleInformation _GetModuleInformation = (t_GetModuleInformation)GetProcAddress( GetModuleHandle( L"kernel32.dll" ), "K32GetModuleInformation" );
|
|
||||||
t_GetModuleBaseNameA _GetModuleBaseNameA = (t_GetModuleBaseNameA)GetProcAddress( GetModuleHandle( L"kernel32.dll" ), "K32GetModuleBaseNameA" );
|
|
||||||
#else
|
|
||||||
t_NtQueryInformationThread NtQueryInformationThread = (t_NtQueryInformationThread)GetProcAddress( GetModuleHandle( "ntdll.dll" ), "NtQueryInformationThread" );
|
|
||||||
t_EnumProcessModules _EnumProcessModules = (t_EnumProcessModules)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "K32EnumProcessModules" );
|
|
||||||
t_GetModuleInformation _GetModuleInformation = (t_GetModuleInformation)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "K32GetModuleInformation" );
|
|
||||||
t_GetModuleBaseNameA _GetModuleBaseNameA = (t_GetModuleBaseNameA)GetProcAddress( GetModuleHandle( "kernel32.dll" ), "K32GetModuleBaseNameA" );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void SysTraceSendExternalName( uint64_t thread )
|
void SysTraceSendExternalName( uint64_t thread )
|
||||||
{
|
{
|
||||||
bool threadSent = false;
|
bool threadSent = false;
|
||||||
@ -320,9 +322,8 @@ void SysTraceSendExternalName( uint64_t thread )
|
|||||||
}
|
}
|
||||||
if( hnd != 0 )
|
if( hnd != 0 )
|
||||||
{
|
{
|
||||||
#if defined NTDDI_WIN10_RS2 && NTDDI_VERSION >= NTDDI_WIN10_RS2
|
|
||||||
PWSTR tmp;
|
PWSTR tmp;
|
||||||
GetThreadDescription( hnd, &tmp );
|
_GetThreadDescription( hnd, &tmp );
|
||||||
char buf[256];
|
char buf[256];
|
||||||
if( tmp )
|
if( tmp )
|
||||||
{
|
{
|
||||||
@ -333,7 +334,6 @@ void SysTraceSendExternalName( uint64_t thread )
|
|||||||
threadSent = true;
|
threadSent = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
const auto pid = GetProcessIdOfThread( hnd );
|
const auto pid = GetProcessIdOfThread( hnd );
|
||||||
if( !threadSent && NtQueryInformationThread && _EnumProcessModules && _GetModuleInformation && _GetModuleBaseNameA )
|
if( !threadSent && NtQueryInformationThread && _EnumProcessModules && _GetModuleInformation && _GetModuleBaseNameA )
|
||||||
{
|
{
|
||||||
|
@ -39,6 +39,11 @@
|
|||||||
|
|
||||||
#include "TracySystem.hpp"
|
#include "TracySystem.hpp"
|
||||||
|
|
||||||
|
#if defined _WIN32 || defined __CYGWIN__
|
||||||
|
extern "C" typedef HRESULT (WINAPI *t_SetThreadDescription)( HANDLE, PCWSTR );
|
||||||
|
extern "C" typedef HRESULT (WINAPI *t_GetThreadDescription)( HANDLE, PWSTR* );
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef TRACY_ENABLE
|
#ifdef TRACY_ENABLE
|
||||||
# include <atomic>
|
# include <atomic>
|
||||||
# include "TracyAlloc.hpp"
|
# include "TracyAlloc.hpp"
|
||||||
@ -96,37 +101,43 @@ TRACY_API void InitRPMallocThread();
|
|||||||
TRACY_API void SetThreadName( const char* name )
|
TRACY_API void SetThreadName( const char* name )
|
||||||
{
|
{
|
||||||
#if defined _WIN32 || defined __CYGWIN__
|
#if defined _WIN32 || defined __CYGWIN__
|
||||||
# if defined NTDDI_WIN10_RS2 && NTDDI_VERSION >= NTDDI_WIN10_RS2
|
static auto _SetThreadDescription = (t_SetThreadDescription)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "SetThreadDescription" );
|
||||||
wchar_t buf[256];
|
if( _SetThreadDescription )
|
||||||
mbstowcs( buf, name, 256 );
|
|
||||||
SetThreadDescription( GetCurrentThread(), buf );
|
|
||||||
# elif defined _MSC_VER
|
|
||||||
const DWORD MS_VC_EXCEPTION=0x406D1388;
|
|
||||||
# pragma pack( push, 8 )
|
|
||||||
struct THREADNAME_INFO
|
|
||||||
{
|
{
|
||||||
DWORD dwType;
|
wchar_t buf[256];
|
||||||
LPCSTR szName;
|
mbstowcs( buf, name, 256 );
|
||||||
DWORD dwThreadID;
|
_SetThreadDescription( GetCurrentThread(), buf );
|
||||||
DWORD dwFlags;
|
}
|
||||||
};
|
else
|
||||||
|
{
|
||||||
|
# if defined _MSC_VER
|
||||||
|
const DWORD MS_VC_EXCEPTION=0x406D1388;
|
||||||
|
# pragma pack( push, 8 )
|
||||||
|
struct THREADNAME_INFO
|
||||||
|
{
|
||||||
|
DWORD dwType;
|
||||||
|
LPCSTR szName;
|
||||||
|
DWORD dwThreadID;
|
||||||
|
DWORD dwFlags;
|
||||||
|
};
|
||||||
# pragma pack(pop)
|
# pragma pack(pop)
|
||||||
|
|
||||||
DWORD ThreadId = GetCurrentThreadId();
|
DWORD ThreadId = GetCurrentThreadId();
|
||||||
THREADNAME_INFO info;
|
THREADNAME_INFO info;
|
||||||
info.dwType = 0x1000;
|
info.dwType = 0x1000;
|
||||||
info.szName = name;
|
info.szName = name;
|
||||||
info.dwThreadID = ThreadId;
|
info.dwThreadID = ThreadId;
|
||||||
info.dwFlags = 0;
|
info.dwFlags = 0;
|
||||||
|
|
||||||
__try
|
__try
|
||||||
{
|
{
|
||||||
RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
|
RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
|
||||||
}
|
}
|
||||||
__except(EXCEPTION_EXECUTE_HANDLER)
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
}
|
||||||
#elif defined _GNU_SOURCE && !defined __EMSCRIPTEN__ && !defined __CYGWIN__
|
#elif defined _GNU_SOURCE && !defined __EMSCRIPTEN__ && !defined __CYGWIN__
|
||||||
{
|
{
|
||||||
const auto sz = strlen( name );
|
const auto sz = strlen( name );
|
||||||
@ -174,20 +185,22 @@ TRACY_API const char* GetThreadName( uint64_t id )
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
# if defined _WIN32 || defined __CYGWIN__
|
# if defined _WIN32 || defined __CYGWIN__
|
||||||
# if defined NTDDI_WIN10_RS2 && NTDDI_VERSION >= NTDDI_WIN10_RS2
|
static auto _GetThreadDescription = (t_GetThreadDescription)GetProcAddress( GetModuleHandleA( "kernel32.dll" ), "GetThreadDescription" );
|
||||||
auto hnd = OpenThread( THREAD_QUERY_LIMITED_INFORMATION, FALSE, (DWORD)id );
|
if( _GetThreadDescription )
|
||||||
if( hnd != 0 )
|
|
||||||
{
|
{
|
||||||
PWSTR tmp;
|
auto hnd = OpenThread( THREAD_QUERY_LIMITED_INFORMATION, FALSE, (DWORD)id );
|
||||||
GetThreadDescription( hnd, &tmp );
|
if( hnd != 0 )
|
||||||
auto ret = wcstombs( buf, tmp, 256 );
|
|
||||||
CloseHandle( hnd );
|
|
||||||
if( ret != 0 )
|
|
||||||
{
|
{
|
||||||
return buf;
|
PWSTR tmp;
|
||||||
|
_GetThreadDescription( hnd, &tmp );
|
||||||
|
auto ret = wcstombs( buf, tmp, 256 );
|
||||||
|
CloseHandle( hnd );
|
||||||
|
if( ret != 0 )
|
||||||
|
{
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# endif
|
|
||||||
# elif defined __linux__
|
# elif defined __linux__
|
||||||
int cs, fd;
|
int cs, fd;
|
||||||
char path[32];
|
char path[32];
|
||||||
|
Loading…
Reference in New Issue
Block a user