From c756e7418e44d5d479a7c06968a5d2f5ece29152 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Mon, 31 Aug 2026 02:47:38 +0200 Subject: [PATCH] Fix android build. --- public/client/TracyCallstack.cpp | 16 ++++++++-------- public/client/TracyCallstack.hpp | 9 ++++++++- public/client/TracyProfiler.cpp | 8 ++++---- public/client/TracySysTrace.cpp | 6 +++--- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/public/client/TracyCallstack.cpp b/public/client/TracyCallstack.cpp index 23d5d75d..e33181b2 100644 --- a/public/client/TracyCallstack.cpp +++ b/public/client/TracyCallstack.cpp @@ -346,7 +346,7 @@ void DestroyImageCaches() } -#ifdef __linux__ +#ifdef TRACY_HAS_EXTERNAL_TARGET # include # include # include @@ -771,7 +771,7 @@ size_t ReadExternalTargetMemory( uint64_t addr, uint32_t size, char* buf ) return 0; } -#endif // __linux__ +#endif // TRACY_HAS_EXTERNAL_TARGET // when "TRACY_SYMBOL_OFFLINE_RESOLVE" is set, instead of fully resolving symbols at runtime, @@ -1638,7 +1638,7 @@ void EndCallstack() #endif } -#ifdef __linux__ +#ifdef TRACY_HAS_EXTERNAL_TARGET static const char* DecodeCallstackPtrFastExternal( uint64_t ptr ) { static char ret[1024]; @@ -1677,7 +1677,7 @@ const char* DecodeCallstackPtrFast( uint64_t ptr ) { static char ret[1024]; -#ifdef __linux__ +#ifdef TRACY_HAS_EXTERNAL_TARGET if( s_externalTargetPid != 0 && s_extImages ) return DecodeCallstackPtrFastExternal( ptr ); #endif @@ -1728,7 +1728,7 @@ static void SymbolAddressErrorCb( void* data, const char* /*msg*/, int /*errnum* sym.needFree = false; } -#ifdef __linux__ +#ifdef TRACY_HAS_EXTERNAL_TARGET static CallstackSymbolData DecodeSymbolAddressExternal( uint64_t ptr ) { CallstackSymbolData sym; @@ -1752,7 +1752,7 @@ CallstackSymbolData DecodeSymbolAddress( uint64_t ptr ) { CallstackSymbolData sym; -#ifdef __linux__ +#ifdef TRACY_HAS_EXTERNAL_TARGET if( s_externalTargetPid != 0 && s_extImages ) return DecodeSymbolAddressExternal( ptr ); #endif @@ -1878,7 +1878,7 @@ void GetSymbolForOfflineResolve(void* address, uint64_t imageBaseAddress, Callst cbEntry.line = 0; } -#ifdef __linux__ +#ifdef TRACY_HAS_EXTERNAL_TARGET static int ExternalCallstackDataCb( void* data, uintptr_t /*pc*/, uintptr_t lowaddr, const char* fn, int lineno, const char* function ) { auto* img = (const ExternalImageEntry*)data; @@ -2015,7 +2015,7 @@ CallstackEntryData DecodeCallstackPtr( uint64_t ptr ) InitAllocator(); if( !IsKernelAddress( ptr ) ) { -#ifdef __linux__ +#ifdef TRACY_HAS_EXTERNAL_TARGET if( s_externalTargetPid != 0 && s_extImages ) return DecodeCallstackPtrExternal( ptr ); #endif diff --git a/public/client/TracyCallstack.hpp b/public/client/TracyCallstack.hpp index c59afaeb..55aa7cc2 100644 --- a/public/client/TracyCallstack.hpp +++ b/public/client/TracyCallstack.hpp @@ -7,6 +7,13 @@ #include "../common/TracyForceInline.hpp" #include "TracyCallstack.h" +// External target API: desktop Linux only. The tracy-monitor that drives +// it builds for Linux x86_64/aarch64 only, and Android, although __linux__, +// lacks process_vm_readv on 32-bit ABIs. +#if defined(__linux__) && !defined(__ANDROID__) && defined(TRACY_HAS_CALLSTACK) +# define TRACY_HAS_EXTERNAL_TARGET +#endif + namespace tracy { @@ -88,7 +95,7 @@ void InitCallstackCritical(); void EndCallstack(); const char* GetKernelModulePath( uint64_t addr ); -#ifdef __linux__ +#ifdef TRACY_HAS_EXTERNAL_TARGET bool InitExternalTarget( pid_t targetPid ); uint32_t GetExternalTargetPid(); const char* GetExternalTargetName(); diff --git a/public/client/TracyProfiler.cpp b/public/client/TracyProfiler.cpp index 7ed1e174..58b6b4e4 100644 --- a/public/client/TracyProfiler.cpp +++ b/public/client/TracyProfiler.cpp @@ -418,7 +418,7 @@ static int64_t SetupHwTimer() static const char* GetProcessName() { -#if defined __linux__ && defined TRACY_HAS_CALLSTACK +#ifdef TRACY_HAS_EXTERNAL_TARGET if( GetExternalTargetPid() != 0 ) return GetExternalTargetName(); #endif @@ -749,7 +749,7 @@ static const char* GetHostInfo() static uint64_t GetPid() { -#if defined __linux__ && defined TRACY_HAS_CALLSTACK +#ifdef TRACY_HAS_EXTERNAL_TARGET const auto externalPid = GetExternalTargetPid(); if( externalPid != 0 ) return uint64_t( externalPid ); #endif @@ -1823,7 +1823,7 @@ void Profiler::Worker() #endif m_exectime = 0; -#if defined __linux__ && defined TRACY_HAS_CALLSTACK +#ifdef TRACY_HAS_EXTERNAL_TARGET if( GetExternalTargetPid() != 0 ) { m_exectime = GetExternalTargetExeTime(); @@ -4484,7 +4484,7 @@ void Profiler::HandleSymbolCodeQuery( uint64_t symbol, uint32_t size ) SendLongString( symbol, buf, size, QueueType::SymbolCode ); }; -#if defined __linux__ && defined TRACY_HAS_CALLSTACK +#ifdef TRACY_HAS_EXTERNAL_TARGET if( GetExternalTargetPid() != 0 ) { auto buf = (char*)tracy_malloc_fast( size ); diff --git a/public/client/TracySysTrace.cpp b/public/client/TracySysTrace.cpp index a5db45b4..0788dc0d 100644 --- a/public/client/TracySysTrace.cpp +++ b/public/client/TracySysTrace.cpp @@ -478,7 +478,7 @@ static bool CurrentProcOwnsThread( uint32_t tid ) if( hv == -tid ) return false; char path[256]; -#ifdef TRACY_HAS_CALLSTACK +#ifdef TRACY_HAS_EXTERNAL_TARGET const auto externalPid = GetExternalTargetPid(); if( externalPid != 0 ) { @@ -815,7 +815,7 @@ bool SysTraceStart( int64_t& samplingPeriod ) } } samplingPeriod = SamplingFrequencyToPeriodNs( samplingFrequency ); -#ifdef TRACY_HAS_CALLSTACK +#ifdef TRACY_HAS_EXTERNAL_TARGET const auto externalPid = GetExternalTargetPid(); #else const uint32_t externalPid = 0; @@ -826,7 +826,7 @@ bool SysTraceStart( int64_t& samplingPeriod ) PerfIterTarget* iter; int numIter; -#ifdef TRACY_HAS_CALLSTACK +#ifdef TRACY_HAS_EXTERNAL_TARGET if( externalPid != 0 ) { uint32_t* tids = nullptr;