GithubHelp home page GithubHelp logo

wolfpld / tracy Goto Github PK

View Code? Open in Web Editor NEW
7.8K 82.0 555.0 28.12 MB

Frame profiler

Home Page: https://tracy.nereid.pl/

License: Other

C++ 88.74% C 8.57% Makefile 0.01% Shell 0.01% TeX 1.48% Objective-C 0.06% CMake 0.35% Meson 0.02% Assembly 0.06% Python 0.69% HTML 0.02%
profiler gamedev gamedev-library library performance performance-analysis profiling profiling-library gamedevelopment

tracy's People

Contributors

adepke avatar annacrombie avatar apache-hb avatar avoroshilov avatar benvanik avatar bjacob avatar c-cube avatar cloudhan avatar dedmen avatar graydon avatar hulakdar avatar jkriegshauser avatar johner avatar krzmbrzl avatar kubouch avatar leandros avatar mulej avatar nagisa avatar rokopt avatar rokups avatar seechange-ci avatar simonvanbernem avatar slomp avatar theblackunknown avatar therocode avatar tillrathmann avatar tvoeroes avatar wolfpld avatar xxxbxxx avatar yalter avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tracy's Issues

Emitting events during thread-local cleanup on Windows will use-after-free the `tracy::Profiler`.

I have a program allocator of which is instrumented with the ___tracy_emit_memory* calls. This program also uses TLS and sets up some TLS destructors during its runtime.

On windows this program will encounter an access violation during shutdown. This is what happens:

  1. tracy::Profiler::~Profiler is called by ucrtbase!execute_onexit_table.
  2. A destructor for TLS in my program is invoked by ntdll!LdrShutdownProcess;
  3. The TLS destructor attempts to free memory using its global (instrumented) allocator, which calls ___tracy_emit_memory_free_callstack(...);
  4. Tracy attempts to add to its queues, which have been since freed (an use-after-free);
  5. The program crashes.

I see a couple options to resolve this:

The easy ones:

  1. Just don’t free the Profiler instance/let OS to deal with it?
  2. Check for m_shutdown, perhaps? Likely UB because its use-after-free as well, given that this would be accessing a field of a destroyed class.

The heavy-handed refactor-level options:

  1. Do not rely on life before/after main so much and let the user control the lifetime of the profiler data structures – moves responsibility of ensuring that no profiling-related functions are called to the user, not too great;
  2. Run the "client" in a separate process, which would monitor the execution of application using APIs usually meant for debugger use. The client then could inject the necessary data structures/code into the process memory as it executes.

Let me know if you want me to get you the binary and/or source and/or full stacktraces and/or something else.

"Resume" should respect the current zoom level.

When using the viewer, the live updating should respect the current zoom level. It's okay for "Resume" to start you at the tens of milliseconds range, but once you zoom out it should respect your zoom level. Otherwise, you have to keep manually dragging the view to the latest events, and the most zoomed in level is pretty useless for certain types of applications.

Feature request: Zone support for setjmp/longjmp error recovery

It's common in C codebases to use non-local exits via setjmp/longjmp for error recovery. Because Tracy zones currently use implicit pairing between zone begin and end commands, a non-local exit will generally break the pairing invariant.

To address this problem, I'd suggest a variant of the zone begin/end commands with an explicit zone ID. The ID can still be generated implicitly with macros similar to the current zone macros (e.g. take the address of a static var to get a unique ID). The zone end command with an explicit ID will pop zones from the zone stack until it finds a zone with the matching ID. In the application code that sets up an error recovery context with setjmp, the programmer can then surround that with a zone begin/end with an explicit ID.

I hacked this into my local copy of Tracy, but it's just a few lines of code and I figure you'd be better suited to deciding how you want to integrate this, so I won't bother with a pull request. Thanks for all the good work on Tracy!

Crash when RDTSCP is not available

I have encountered a situation where tracy fails on (bit old) x64 laptop because RDTSCP instruction is not available. It appears that we can not assume RDTSCP presence on x86-64 platforms.

Feature to Always be Listening?

My use case is I have relatively short lived processes, usually just pressing the "connect" button and then running it is enough. I don't really want to use the feature that prevents the program from exiting. But sometimes the same process runs multiple times and the one I need to profile isn't always the first one, or I need to profile them all. Not sure how this would work if there's multiple processes running at the same time. If that would be limited in some way. That does happen, generally it is just one process running one after the other.

It would be really useful to just have a "start listening" button and then it'll capture everything until "stop listening" is pressed or otherwise. Then having a list to choose from the traces with some details about them would be very useful.

Fantastic project!

I will close this issue immediately but I would like to register that this is a fantastic project with one most well written manuals I have ever seem. If I end up using the profiler I will strongly consider sponsoring the project, but I am in the investigation phase for now.

SEGV_MAPERR on _memory_heap_thread_cache_extract

I'm trying to use Tracy from Android and have been unable to get past this SIGSEGV fault. I can build and link fine, but just one Tracy C call (TracyCZoneN) triggers this failure on startup (i.e. from __cxx_global_var_init before the my C call is reached), so I assume I'm missing something fundamental...

Tracy is being built with these flags currently :
-DTRACY_ENABLE -fno-sanitize=undefined -DTRACY_DELAYED_INIT=1 -DENABLE_PRELOAD -DENABLE_THREAD_CACHE=1

Any guidance on where to begin or what a failure in _memory_heap_thread_cache_extract implies is greatly appreciated.

: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x6b2f1d5e294bd3
backtrace:
   #00 pc 0000000000122d48  lib/arm64/libandroid_native_app_glue.so (_ZN5tracyL33_memory_heap_thread_cache_extractEPNS_6heap_tEm+36)
   #01 pc 0000000000122c24  lib/arm64/libandroid_native_app_glue.so (_ZN5tracyL29_memory_heap_extract_new_spanEPNS_6heap_tEmj+20)
   #02 pc 0000000000122f58  lib/arm64/libandroid_native_app_glue.so (_ZN5tracyL22_memory_allocate_largeEPNS_6heap_tEm+40)
   #03 pc 000000000012297c  lib/arm64/libandroid_native_app_glue.so (_ZN5tracyL26_memory_allocate_oversizedEPNS_6heap_tEm+24)
   #04 pc 000000000011ead0  lib/arm64/libandroid_native_app_glue.so (_ZN5tracyL16_memory_allocateEPNS_6heap_tEm+56)
   #05 pc 000000000011ea74  lib/arm64/libandroid_native_app_glue.so (_ZN5tracy8rpmallocEm+24)
   #06 pc 000000000010a294  lib/arm64/libandroid_native_app_glue.so (_ZN5tracyL12tracy_mallocEm+8)
   #07 pc 00000000001168b0  lib/arm64/libandroid_native_app_glue.so (_ZN5tracy8ProfilerC1Ev+176)
   #08 pc 00000000000df188  lib/arm64/libandroid_native_app_glue.so (__cxx_global_var_init.8+24)
   #09 pc 00000000000df1f4  lib/arm64/libandroid_native_app_glue.so (_GLOBAL__I_000105+8)

Question: Is there a way to customize the sampling rate for call stacks?

Did not find anything about it in the manual in chapters 3.13.4 or 5.2.3.3 (A search for " rate" did not yield anything either)

Is there some technical limitation for this on windows, did I just miss it, or is it a nice-to-have possible future feature?

If I'm reading this right (Which I'm likely not to be)

interval.Interval = 1250; // 8 kHz
const auto intervalStatus = TraceSetInformation( 0, TraceSampledProfileIntervalInfo, &interval, sizeof( interval ) );
if( intervalStatus != ERROR_SUCCESS ) return false;
samplingPeriod = 125*1000;
it's a hardcoded rate at the moment

Allow show zone time in frames to use total time instead of self time

I briefly checked the manual and the UI and couldn't find this. I'm referring to this button: https://i.imgur.com/TUDlV72.png

I tried using the Self Time mark for the histogram but that wasn't it.

I think this could be useful for a zone that results in rare spikes in frames but which has very little self time, and for which the time is spread in many smaller zones (or which has different high latency zones in it in different frames)

Unable to find entrance

Tracy. Exe-
Unable to find entrance
Unable to locate SetThreadDescription on the dynamic link library KERNEL32.dll

win7x64

Add support for instrumentation of std::mutex locks with std::condition_variable

Tracy provides a convenient way for instrumentation of std::mutex with TracyLockable wrapper and integration with std::lock_guard using LockableBase, but this is not enough to cover all use cases. A way for instrumentation of std::mutex locks using std::condition_variable is also required:

// common thread variables
std::mutex              wait_mutex;
std::condition_variable wait_condition_var;
bool                    is_signalled = false;

// waiting thread
std::unique_lock<std::mutex> lock(wait_mutex);
wait_condition_var.wait(lock, [this]{ return is_signalled; });

// signalling thread
is_signalled = true;
wait_condition_var.notify_one();

CalibrateDelay assert error when using OSMesa & operator new overload

I've written a simple program using the recommended new & delete overloads from the manual:

#include <new>
#include <Tracy.hpp>

void* operator new(std::size_t count)
{
  auto ptr = malloc(count);
  TracyAlloc(ptr, count);
  return ptr;
}

void operator delete(void* ptr) noexcept
{
  TracyFree(ptr);
  free(ptr);
}

int main() {}

Compile it with g++ -DTRACY_ENABLE path/to/tracy/TracyClient.cpp -I path/to/tracy/ x.cpp -lpthread -ldl -lOSMesa. When I try to run the executable, I get an assert:

TracyProfiler.cpp:2602: void tracy::Profiler::CalibrateDelay(): Assertion `sz > 0' failed.

The happens with the 0.7 release and the current master (420bdd5). In release mode (NDEBUG defined), due to the lack of the assert CalibrateDelay actually ends up in an infinite loop. If I remove the operator new and delete, this small sample works correctly. If I remove -lOSMesa, it works too.

If I set a breakpoint inside operator new in gdb it is called from llvm (a dependency of osmesa) quite a few times, while still in the dynamic loader:

#0  operator new (count=40) at /mnt/ram/x.cpp:6
#1  0x00007ffff448b4be in ?? () from /usr/lib/llvm/10/lib64/libLLVM-10.so
#2  0x00007ffff7f681b7 in __pthread_once_slow (once_control=0x7ffff6cfca8c, init_routine=0x7ffff71896d0 <__once_proxy>) at pthread_once.c:116
#3  0x00007ffff448b5b5 in void std::call_once<void (&)()>(std::once_flag&, void (&)()) () from /usr/lib/llvm/10/lib64/libLLVM-10.so
#4  0x00007ffff448b63b in llvm::ManagedStaticBase::RegisterManagedStatic(void* (*)(), void (*)(void*)) const () from /usr/lib/llvm/10/lib64/libLLVM-10.so
#5  0x00007ffff442ccaa in llvm::cl::OptionCategory::registerCategory() () from /usr/lib/llvm/10/lib64/libLLVM-10.so
#6  0x00007ffff437412a in llvm::orc::NullLegacyResolver::findSymbolInLogicalDylib(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib/llvm/10/lib64/libLLVM-10.so
#7  0x00007ffff7fe2dfa in call_init (l=<optimized out>, argc=argc@entry=1, argv=argv@entry=0x7fffffffd438, env=env@entry=0x7fffffffd448) at dl-init.c:72
#8  0x00007ffff7fe2ef9 in call_init (env=0x7fffffffd448, argv=0x7fffffffd438, argc=1, l=<optimized out>) at dl-init.c:30
#9  _dl_init (main_map=0x7ffff7ffe130, argc=1, argv=0x7fffffffd438, env=0x7fffffffd448) at dl-init.c:119
#10 0x00007ffff7fd40ca in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#11 0x0000000000000001 in ?? ()
#12 0x00007fffffffd85c in ?? ()
#13 0x0000000000000000 in ?? ()

And profiler is only initialized later, when c++ global constructors are called

#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007ffff6da153d in __GI_abort () at abort.c:79
#2  0x00007ffff6da1411 in __assert_fail_base (fmt=0x7ffff6f05058 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x5555555bbc35 "sz > 0", file=0x5555555bba5c "client/TracyProfiler.cpp", line=2602, function=<optimized out>) at assert.c:92
#3  0x00007ffff6db0282 in __GI___assert_fail (assertion=0x5555555bbc35 "sz > 0", file=0x5555555bba5c "client/TracyProfiler.cpp", line=2602, function=0x5555555bc200 "void tracy::Profiler::CalibrateDelay()") at assert.c:101
#4  0x00005555555983dd in tracy::Profiler::CalibrateDelay (this=0x5555555c9300 <tracy::s_profiler>) at client/TracyProfiler.cpp:2602
#5  0x0000555555591a76 in tracy::Profiler::Profiler (this=0x5555555c9300 <tracy::s_profiler>) at client/TracyProfiler.cpp:1080
#6  0x00005555555b5d14 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=105) at client/TracyProfiler.cpp:1014
#7  0x00005555555b5e55 in _GLOBAL__sub_I.00105__ZN5tracy6detail19GetThreadHandleImplEv(void) () at libbacktrace/elf.cpp:3512
#8  0x00005555555b9ab5 in __libc_csu_init (argc=argc@entry=1, argv=argv@entry=0x7fffffffd438, envp=0x7fffffffd448) at elf-init.c:88
#9  0x00007ffff6da2cac in __libc_start_main (main=0x5555555b9a5e <main()>, argc=1, argv=0x7fffffffd438, init=0x5555555b9a70 <__libc_csu_init>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffd428) at ../csu/libc-start.c:264
#10 0x000055555555861a in _start ()

OS: Gentoo Linux, mesa-20.1.2, gcc 9.3.0, but the same happens with clang too.

iOS call stack support

Hi,

First and foremost - I find this tool amazing! Thank you so much for putting effort into it!

I Was trying to use tracy with a library I wrote in c++ in iOS environment.

It all seemed to work great except for missing call stacks.
In #8 I saw that you mentioned that it makes no sense to catch crashes on iOS as there are no symbols on the device.

I don't know about crashes (as I didn't test it yet) but for typical profiling I managed to workaround this issue by:

  1. removing the ".app" suffix from the dSYM file (currently its auto-generated name is .app.dSYM) due to macho.cpp's search path expectation (dsymsuffixdir).
  2. pushing the dSYM file alongside my app's binary (as I do for any other resource needed during runtime).

I've decided to share my findings here for my fellas iOS programmers and for you to consider adding these as side notes to the manual.

Tnx.

Tracy does not connect to TestCpu example application

I've built Tracy profiler and TestCpu app from examples v0.6.3 for Windows x64 with VS2019 (see binaries here, note that TestCpu was modified to render 100 frames to work a little longer on my machine) and tried some testing with the folowing steps:

  1. Start Tracy.exe
  2. Start TestCpu.exe
  3. Press Connect button in Tracy app with default address 127.0.0.1=> message Waiting for connection is displayed forever.

I've tried this test even with disabled firewall and antivirus with same result. Network monitor does not show any ports open by TestCpu app. What I'm doing wrong? Could you also describe how Tracy initializes its connection wihtout any additional function calls just with TestClient.cpp added to the target application build?

Issue with 'TRACY_DELAYED_INIT'

Hi there,

I had an issue with combining 'TRACY_DELAYED_INIT' on Windows, causing fails with rpmalloc.
It might be also correlated to issue #42, since (as far as I understand) for apple the 'TRACY_DELAYED_INIT' is set.

During investigation, I found that line 163 in TracySystem.cpp caused all the fuss:

        const auto sz = strlen( name );
        char* buf = (char*)tracy_malloc( sz+1 );
        memcpy( buf, name, sz );
        buf[sz+1] = '\0';

buf[sz+1] = '\0'; should be buf[sz] = '\0'; I guess.

And thanks for that great software :D

Tracy-instrumented application crashes in Tracy's static intializers when started through RenderDoc

When I try to start my game, which is instrumented using tracy, in RenderDoc, the game instantly crashes due to a static variable of Tracy's moodycamel queue failing to initialize. The actual violation is a nullptr dereference inside a critical section of malloc.

This is a bug that seems to be the result of some weird interaction and the tool RenderDoc: I originally thought this was an issue with RenderDoc, and reported it, but the maintainer pointed out to me that this is actually a crash in my application (see the issue at RenderDoc's Github for details).

The stacktrace shows that the crash happens, when malloc tries to take a lock duing the initialization of a ProducerToken inside of Tracy:

RtlpWaitOnCriticalSection
RtlpEnterCriticalSectionContended
RtlEnterCriticalSection
__acrt_lock Line 55 at minkernel\crts\ucrt\src\appcrt\internal\locks.cpp(55)
heap_alloc_dbg_internal Line 309 at minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp(309)
heap_alloc_dbg Line 450 at minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp(450)
_malloc_dbg Line 496 at minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp(496)
tracy::moodycamel::ConcurrentQueueDefaultTraits::WORKAROUND_malloc Line 224 at B:\spaced\source\tracy\client\tracy_concurrentqueue.h(224)
tracy::moodycamel::ConcurrentQueueDefaultTraits::malloc Line 226 at B:\spaced\source\tracy\client\tracy_concurrentqueue.h(226)
tracy::moodycamel::ConcurrentQueuetracy::QueueItem,tracy::moodycamel::ConcurrentQueueDefaultTraits::create<tracy::moodycamel::ConcurrentQueuetracy::QueueItem,tracy::moodycamel::ConcurrentQueueDefaultTraits::ExplicitProducer,tracy::moodycamel::ConcurrentQueuetracy::QueueItem,tracy::moodycamel::ConcurrentQueueDefaultTraits *> Line 1428 at B:\spaced\source\tracy\client\tracy_concurrentqueue.h(1428)
tracy::moodycamel::ConcurrentQueuetracy::QueueItem,tracy::moodycamel::ConcurrentQueueDefaultTraits::recycle_or_create_producer Line 1366 at B:\spaced\source\tracy\client\tracy_concurrentqueue.h(1366)
tracy::moodycamel::ConcurrentQueuetracy::QueueItem,tracy::moodycamel::ConcurrentQueueDefaultTraits::recycle_or_create_producer Line 1346 at B:\spaced\source\tracy\client\tracy_concurrentqueue.h(1346)
tracy::moodycamel::ProducerToken::ProducerTokentracy::QueueItem,tracy::moodycamel::ConcurrentQueueDefaultTraits Line 1458 at B:\spaced\source\tracy\client\tracy_concurrentqueue.h(1458)
tracy::`dynamic initializer for 's_token_detail'' Line 975 at B:\spaced\source\tracy\client\TracyProfiler.cpp(975)
__dyn_tls_init Line 79 at d:\agent_work\5\s\src\vctools\crt\vcstartup\src\tls\tlsdyn.cpp(79)
LdrpCallInitRoutine
LdrpCallTlsInitializers
LdrpInitializeThread
_LdrpInitialize
LdrpInitialize
LdrInitializeThunk

The maintainer of RenderDocs guess on the bug is the following:

If I had to guess I'd say that your code enters a critical section in some static initialiser that runs on thread attach, but the critical section isn't initialised until after main() is entered. RenderDoc injects a thread to insert its hooks which will run before main(), so any global initialisers that are fragile like this can break.

Now. I don't really know if this a bug in your code, or moodycamels, or even MSVC C++ library, but since you have comments in TracyProfiler.cpp that mention binary sections and initialization just above the code in question (lines 974 and 975) I hope that you might know how to fix this.

I am on tracy version 0.7

If you need to repro the issue, I can send you my application+renderdoc and instructions on how to repro. It should take only a couple of minutes.

Add CMake support

Since Tracy is a cross-platform project that targets multiple operating and build systems it is highly required to support CMake build and integration with other CMake-based projects. While it's generally easy to add TracyClient.cpp to the project build, it may look dirty in CMakeList.txt to add some external file to your module and it would be much cleaner to add static linking with externally defined TracyClient CMake target.

TRACY_NO_EXIT and sudo. Bad combination?

In my newest test I am trying to run a test application with TRACY_NO_EXIT, however, running the application with sudo seems to have no effect. The application is rather simple as you can see. I couldn't find anything in the manual mentioning this problem. So, is this an actual problem or expected behaviour?

#include <iostream>
#include <mutex>
#include <string>
#include <chrono>

#include "Tracy.hpp"

int SharedCounter = 0;
TracyLockableN(std::mutex, AccMutex, "Counter Mutex");

#define CALLSTACK_DEPTH 5

void threadFunc(int tid) {
    tracy::SetThreadName(("Accumulator " + std::to_string(tid)).c_str());

    ZoneScopedNS("Thread Func", CALLSTACK_DEPTH);
    for (int i = 0; i < 100; ++i) {
        std::lock_guard<LockableBase(std::mutex)> lock(AccMutex);
        ZoneScopedNS("Counting", CALLSTACK_DEPTH);
        SharedCounter += 1;
        std::this_thread::sleep_for(std::chrono::microseconds{ 10 });
        TracyPlot("Counter Value", static_cast<int64_t>(SharedCounter));
    }
}

int main() {
    std::cout << "HELLO" << std::endl;
    TracyPlotConfig("Counter Value", tracy::PlotFormatType::Number);
    ZoneScopedNS("Main Function", CALLSTACK_DEPTH);
    TracyMessageL("Starting Thread 1");
    std::thread t1(threadFunc, 1);
    TracyMessageL("Starting Thread 2");
    std::thread t2(threadFunc, 2);
    t1.join();
    TracyMessageL("Thread 1 Finished");
    t2.join();
    TracyMessageL("Thread 2 Finished");
    std::cout << SharedCounter << std::endl;
    return 0;
}

[C API/UNIX] rpmalloc intializers will fail to run for non-main threads leading to SIGABRT

I’m using the C tracy API. As an experiment I called the first function I came across – ___tracy_alloc_srcloc and the application immediately aborted. Attached is the stack-trace:

(gdb) bt
#0  0x000055555557fea3 in tracy::_memory_allocate_small (heap=0x0, size=32) at tracy/client/tracy_rpmalloc.cpp:1270
#1  0x0000555555580134 in tracy::_memory_allocate (heap=0x0, size=32) at tracy/client/tracy_rpmalloc.cpp:1343
#2  0x00005555555815af in tracy::rpmalloc (size=32) at tracy/client/tracy_rpmalloc.cpp:2135
#3  0x00005555555660a0 in tracy::tracy_malloc (size=32) at tracy/common/TracyAlloc.hpp:16
#4  0x000055555557ba51 in tracy::Profiler::AllocSourceLocation (function=0x55555561301f "test_fn", source=0x555555613013 "<no-source>", line=0) at tracy/client/TracyProfiler.hpp:489
#5  ___tracy_alloc_srcloc (line=0, source=0x555555613013 "<no-source>", function=0x55555561301f "test_fn") at tracy/client/TracyProfiler.cpp:3068
<snip>
#19 0x00007ffff7dccedd in start_thread () from /nix/store/jx19wa4xlh9n4324xdl9rjnykd19mmq3-glibc-2.30/lib/libpthread.so.0
#20 0x00007ffff7ce3a4f in clone () from /nix/store/jx19wa4xlh9n4324xdl9rjnykd19mmq3-glibc-2.30/lib/libc.so.6

TracyClient was built as such:

"g++" "-O3" "-ffunction-sections" "-fdata-sections" "-fPIC" "-m64" "-Wall" "-Wextra" "-DTRACY_ENABLE" "-o" "out/tracy/TracyClient.o" "-c" "tracy/TracyClient.cpp
"ar" "crs" "out/libtracy-client.a" "out/tracy/TracyClient.o"

And then linked directly to the test executable that invokes this function from a thread. The thread is created by a test framework.


From spelunking the code base I found that the rpmalloc_thread_initialize is set-up to be called through a TLS initializer – and indeed it is, at least for the main thread:

(gdb) br RPMallocInit::RPMallocInit()
Breakpoint 1 at 0x1e638: file tracy/client/TracyProfiler.cpp, line 143.
(gdb) run
Breakpoint 1, tracy::RPMallocInit::RPMallocInit (this=0x55555564da70 <tracy::s_rpmalloc_init>) at tracy/client/TracyProfiler.cpp:143
(gdb) bt
#0  tracy::RPMallocInit::RPMallocInit (this=0x55555564da70 <tracy::s_rpmalloc_init>) at tracy/client/TracyProfiler.cpp:143
#1  0x00005555555948b1 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=102) at tracy/client/TracyProfiler.cpp:987
#2  0x00005555555950c1 in _GLOBAL__sub_I.00102_TracyClient.cpp(void) () at tracy/libbacktrace/elf.cpp:3512
#3  0x0000555555612e85 in __libc_csu_init ()
#4  0x00007ffff7c0fd1a in __libc_start_main () from /nix/store/jx19wa4xlh9n4324xdl9rjnykd19mmq3-glibc-2.30/lib/libc.so.6
#5  0x000055555556556a in _start () at ../sysdeps/x86_64/start.S:120

However, it does not appear to be called again for the newly created threads. And that's why I ultimately encounter a crash.


The manual does not appear to indicate that the client library must be used in the main thread, or that there are any initialization routines for the user to call, or that it is necessary to specify certain defines (such as ENABLE_PRELOAD) to use the client library in a multi-threaded program.

[RFC] Adjust the `___tracy_alloc_*` functions to take pointer-size pairs for source/function

In section 3.1 of the manual the following snippet can be found:

3.1 Handling text strings

When dealing with Tracy macros, you will encounter two ways of providing string data to the profiler. In both cases you should pass const char* pointers, but there are differences in expected life-time of the pointed data.

  1. When a macro only accepts a pointer (for example: TracyMessageL(text)), the provided string data must be accessible at any time in program execution (this also includes the time after exiting the main function). The string also cannot be changed. This basically means that the only option is to use a string literal (e.g.: TracyMessageL("Hello")).
  2. If there’s a string pointer with a size parameter (for example: TracyMessage(text, size)), the profiler will allocate an internal temporary buffer to store the data. The pointed-to data is not used afterwards. You should be aware that allocating and copying memory involved in this operation has a small time cost.

While this paragraph is only relevant to macros, I think there is something to be said about extending this concept to at least some of the functions as well.

For instance the signatures for the ___tracy_alloc_srcloc_* functions are currently these:

TRACY_API uint64_t ___tracy_alloc_srcloc( uint32_t line, const char* source, const char* function );
TRACY_API uint64_t ___tracy_alloc_srcloc_name( uint32_t line, const char* source, const char* function, const char* name, size_t nameSz );

Note that name has an associated size parameter, however source and function do not. This, in addition to being inconsistent, can also necessitate additional allocations for the API users who don’t have null-terminated strings handy.

If this change were implemented, the users who do deal in 0-terminated strings would end up having to strlen them at a call location. However the implementation of this function strlens the arguments internally anyway, so the cost of allocating a location would not change for those users, while it would improve, ever so slightly, for those who have the lengths handy.

X Error of failed request: BadWindow (invalid Window parameter)

After building the profiler from source (master branch commit 11e1671), I get a crash at runtime, something to do with the X window system:

[nix-shell:~/Downloads/tracy/profiler/build/unix]$ ./Tracy-release 
X Error of failed request:  BadWindow (invalid Window parameter)
  Major opcode of failed request:  40 (X_TranslateCoords)
  Resource id in failed request:  0x0
  Serial number of failed request:  189
  Current serial number in output stream:  189

[nix-shell:~/Downloads/tracy/profiler/build/unix]$ ./Tracy-debug 
X Error of failed request:  BadWindow (invalid Window parameter)
  Major opcode of failed request:  40 (X_TranslateCoords)
  Resource id in failed request:  0x0
  Serial number of failed request:  189
  Current serial number in output stream:  189

Please let me know if there is any other information I can provide to troubleshoot this.

import-chrome: "args" is not imported

I'm importing trace data in Chrome format where most of the useful info is contained under args key like this:

 293   │   {
 294   │     "ts": 1589232324367717,
 295   │     "args": {
 296   │       "args": "[\"--user\",\"--no-user-package-db\",\"--package-db\",\"/Users/ethercrow/.stack/snapshots/x86_64-osx/87e154bcf63658f29f1e89e07af68ff63
       │ 963d64fc0e107f1e947001fc28f6600/8.6.5/pkgdb\",\"dump\",\"--expand-pkgroot\"]",
 297   │       "process": "/Users/ethercrow/.stack/programs/x86_64-osx/ghc-8.6.5/bin/ghc-pkg-8.6.5"
 298   │     },
 299   │     "tid": 4,
 300   │     "name": "sinkProcessStdout",
 301   │     "pid": 1,
 302   │     "ph": "B"
 303   │   },
 304   │   {
 305   │     "ts": 1589232324470187,
 306   │     "tid": 4,
 307   │     "name": "sinkProcessStdout",
 308   │     "pid": 1,
 309   │     "ph": "E"
 310   │   },

Unfortunately Tracy doesn't show this info:

Screen Shot 2020-05-11 at 11 27 02 PM

and as far as I can see in import-chrome.cpp, doesn't read that field. tracy::Worker::ImportEventTimeline doesn't appear to have a field where one could put this data.

Diverging macros TracyOpenCL.hpp

The number of parameters in some of the macros in TracyOpenCL.hpp with and without TRACY_ENABLE is different and some macros are even missing when compiled without Tracy enabled (e.g., TracyCLZoneSetEvent). This leads to build errors.

I can file a PR on this when I have some time. Seems like a trivial fix.

Make prebuilt binaries available in releases?

Would it be possible to add prebuilt binaries of the visualizer app? Making prebuilt binaries available would reduce the friction of the initial setup. It's easy to add the Tracy runtime to an app, but a little harder to build the visualizer (fiddling with vcpkg, and requires VS2019 which isn't necessarily available in a commercial shop).

For example the Optick profiler:
https://github.com/bombomby/optick/releases
has its visualizer app prebuilt and available for download, which is all that's needed most of the time.

What does TracyGpuZone do?

Hello, I am experimenting with the GPU tracing capabilities and I am trying to understand what GPU tracing capabilities does tracy offer. I couldn't find an example code using this feature. So, to see what is does I have the following Draw function in my sample application.

void Draw()
{
    ZoneScoped;
    TracyGpuZone("GPU Draw");
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    TheScene->Draw();
}

And right after I initialise my context I call TracyGpuContext.

In the profiler UI I see a zone with the name "GPU Draw". When I hover the mouse in it I get a GPU execution time. Which is great! I was just wondering if this is all that is meant to be collected and what would be some other use cases for the TracyGpuZone feature.

Thanks.

Add the ability to restrict the statistics window to a time frame and display both inclusive/exclusive times at once.

I quite often want to know things like "what functions took long during this frame", "how often did this zone appear during this function call", "was this also a problem when the client wasn't connected to the server" or "what took long only during startup". Right now, tracy can't answer these questions since the statistics evaluates all zones globally. It would be great, to be able to restrict the statistics window to a timeframe, similar to how one can create annotations. Just select a timeframe and the statistics only evaluate zones that overlap the timeframe. Then tracy would be able to answer all these questions.

Also one more oddity I noticed: inclusive/exclusive time measurement is a toggle in tracy, when basically all other profiling frontends I know display this information side by side. I don't know if there is a benefit from doing this differently, but personally, I have stumbled a couple of times about this break in convention. So if there is no good reason why this is the way it is, I would find it more accessible to match the existing convention.

Problem with Tracy in a DLL and TRACY_NO_EXIT

Hi, I am doing more tests with Tracy and this time I am trying to use a DLL as described in the Section 2.1.4 of the manual. For this setup I have a single thread application that calls into a library (DLL) that is supposed to be profiled with Tracy but I am getting an access violation in the Profiler destructor. Here are more details of my setup

  1. DLL Called TracyClient.dll containing just TracyClient.cpp
  2. A DLL that I want to profile with Tracy, called TracyBackend.dll
  3. An application that links against TracyBackend.dll
  4. The application runs with TRACY_NO_EXIT

This only happens when TRACY_NO_EXIT is defined. Is there a limitation here?

The following image shows the place of the crash.

image

Assertion failed in Socket::Connect

Hello,

tracy crashes when a client attempts to connect:

Tracy-debug: ../../../common/TracySocket.cpp:116: bool tracy::Socket::Connect(const char*, int): Assertion `c == -1' failed.
fish: “./Tracy-debug” terminated by signal SIGABRT (Abort)

What I'm doing:

  • launching tracy
  • launching my client app
  • in tracy, clicking either on Connect or on the discovered client

I'm running fedora 32 and using 25c7245

compilation problem with linux regarding TBB dependency

After applying the following (unrelated) patch to fix a GCC error:

--- a/server/TracyView.cpp
+++ b/server/TracyView.cpp
@@ -12656,7 +12656,7 @@ void View::DrawInfo()
                 pdqsort_branchless( vec.begin(), vec.end(), []( const auto& lhs, const auto& rhs ) { return strcmp( lhs->first, rhs->first ) < 0; } );
                 for( auto& v : vec )
                 {
-                    ImGui::BulletText( v->first );
+                    ImGui::BulletText( "%s", v->first );
                     if( ImGui::IsItemClicked() ) ViewSource( v->first, 0 );
                     ImGui::SameLine();
                     ImGui::TextDisabled( "(%s)", MemSizeToString( v->second.len ) );

Compilation gets to the end and exits with linker errors:

/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task_arena.h:216: undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&, long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o: in function `operator new(unsigned long, tbb::internal::allocate_additional_child_of_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o: in function `operator new(unsigned long, tbb::internal::allocate_child_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1171: undefined reference to `tbb::internal::allocate_child_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, long*, std::less<long>, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, long*, std::less<long>, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, long*, long*, std::less<long>, std::integral_constant<bool, true>, std::integral_constant<bool, true>, std::integral_constant<bool, true>)::{lambda()#1}::operator()() const::{lambda(long*, long*, std::less<long>)#1}>(__pstl::execution::v1::parallel_unsequenced_policy const&, long*, long*, std::less<long>, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, long*, std::less<long>, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, long*, long*, std::less<long>, std::integral_constant<bool, true>, std::integral_constant<bool, true>, std::integral_constant<bool, true>)::{lambda()#1}::operator()() const::{lambda(long*, long*, std::less<long>)#1}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:86: undefined reference to `tbb::internal::allocate_via_handler_v3(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o: in function `operator new(unsigned long, tbb::internal::allocate_root_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1145: undefined reference to `tbb::internal::allocate_root_proxy::allocate(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, long*, std::less<long>, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, long*, std::less<long>, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, long*, long*, std::less<long>, std::integral_constant<bool, true>, std::integral_constant<bool, true>, std::integral_constant<bool, true>)::{lambda()#1}::operator()() const::{lambda(long*, long*, std::less<long>)#1}>(__pstl::execution::v1::parallel_unsequenced_policy const&, long*, long*, std::less<long>, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, long*, std::less<long>, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, long*, long*, std::less<long>, std::integral_constant<bool, true>, std::integral_constant<bool, true>, std::integral_constant<bool, true>)::{lambda()#1}::operator()() const::{lambda(long*, long*, std::less<long>)#1}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o:(.data.rel.ro._ZTIN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_16__serial_destroyENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE[_ZTIN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_16__serial_destroyENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE]+0x10): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o:(.data.rel.ro._ZTIN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE[_ZTIN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE]+0x10): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o:(.data.rel.ro._ZTIN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E1_ZNSO_7executeEvEUlS2_S2_S2_E2_EEEE[_ZTIN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E1_ZNSO_7executeEvEUlS2_S2_S2_E2_EEEE]+0x10): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o:(.data.rel.ro._ZTVN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_16__serial_destroyENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE[_ZTVN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_16__serial_destroyENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE]+0x28): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o:(.data.rel.ro._ZTVN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE[_ZTVN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE]+0x28): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o:(.data.rel.ro._ZTVN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E1_ZNSO_7executeEvEUlS2_S2_S2_E2_EEEE[_ZTVN6__pstl13__par_backend12__merge_taskIPlS2_S2_St4lessIlENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E1_ZNSO_7executeEvEUlS2_S2_S2_E2_EEEE]+0x28): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o:(.data.rel.ro._ZTIN6__pstl13__par_backend18__stable_sort_taskIPlS2_St4lessIlEZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SG_T1_T2_SD_SD_ENKUlvE_clEvEUlS2_S2_S4_E_EE[_ZTIN6__pstl13__par_backend18__stable_sort_taskIPlS2_St4lessIlEZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SG_T1_T2_SD_SD_ENKUlvE_clEvEUlS2_S2_S4_E_EE]+0x10): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyView.o:(.data.rel.ro._ZTVN6__pstl13__par_backend18__stable_sort_taskIPlS2_St4lessIlEZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SG_T1_T2_SD_SD_ENKUlvE_clEvEUlS2_S2_S4_E_EE[_ZTVN6__pstl13__par_backend18__stable_sort_taskIPlS2_St4lessIlEZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SG_T1_T2_SD_SD_ENKUlvE_clEvEUlS2_S2_S4_E_EE]+0x28): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_child_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1171: undefined reference to `tbb::internal::allocate_child_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `std::enable_if<__pstl::execution::v1::is_execution_policy<std::decay<__pstl::execution::v1::parallel_unsequenced_policy const&>::type>::value, void>::type std::sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*>(__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, unsigned long*) [clone .isra.0]':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task_arena.h:216: undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&, long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_additional_child_of_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_child_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1171: undefined reference to `tbb::internal::allocate_child_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_child_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1171: undefined reference to `tbb::internal::allocate_child_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_child_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1171: undefined reference to `tbb::internal::allocate_child_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_additional_child_of_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_child_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1171: undefined reference to `tbb::internal::allocate_child_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::Worker::Exec()::{lambda(auto:1 const&, auto:2 const&)#5}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#5}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#5}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#5})#1}>(std::integral_constant<bool, true>, tracy::SymbolLocation*, tracy::SymbolLocation*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::Exec()::{lambda(auto:1 const&, auto:2 const&)#5}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:86: undefined reference to `tbb::internal::allocate_via_handler_v3(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_root_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1145: undefined reference to `tbb::internal::allocate_root_proxy::allocate(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::Worker::Exec()::{lambda(auto:1 const&, auto:2 const&)#5}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#5}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#5}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#5})#1}>(std::integral_constant<bool, true>, tracy::SymbolLocation*, tracy::SymbolLocation*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::Exec()::{lambda(auto:1 const&, auto:2 const&)#5}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::PlotItem*, tracy::Worker::HandlePostponedPlots()::{lambda(auto:1 const&, auto:2 const&)#1}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::PlotItem*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::PlotItem*, tracy::PlotItem*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(tracy::PlotItem*, tracy::PlotItem*, {lambda(auto:1 const&, auto:2 const&)#1})#1}>(std::integral_constant<bool, true>, tracy::PlotItem*, tracy::PlotItem*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::HandlePostponedPlots()::{lambda(auto:1 const&, auto:2 const&)#1}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:86: undefined reference to `tbb::internal::allocate_via_handler_v3(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_root_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1145: undefined reference to `tbb::internal::allocate_root_proxy::allocate(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::PlotItem*, tracy::Worker::HandlePostponedPlots()::{lambda(auto:1 const&, auto:2 const&)#1}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::PlotItem*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::PlotItem*, tracy::PlotItem*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(tracy::PlotItem*, tracy::PlotItem*, {lambda(auto:1 const&, auto:2 const&)#1})#1}>(std::integral_constant<bool, true>, tracy::PlotItem*, tracy::PlotItem*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::HandlePostponedPlots()::{lambda(auto:1 const&, auto:2 const&)#1}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `_ZNK3tbb10interface78internal18delegated_functionIKZN6__pstl13__par_backend22__parallel_stable_sortIRKNS3_9execution2v127parallel_unsequenced_policyEPN5tracy6Worker14ZoneThreadDataEZZNSC_C4ERNSB_8FileReadENSB_9EventType4TypeEbENKUlvE1_clEvEUlRKT_RKT0_E5_ZZNS3_10__internal14__pattern_sortISA_SE_SQ_St17integral_constantIbLb1EEEEvOSK_SN_SN_T1_T2_SU_SU_ENKUlvE_clEvEUlSE_SE_SQ_E_EEvSV_SN_SN_SW_SX_mEUlvE_vEclEv':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:86: undefined reference to `tbb::internal::allocate_via_handler_v3(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_root_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1145: undefined reference to `tbb::internal::allocate_root_proxy::allocate(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `_ZNK3tbb10interface78internal18delegated_functionIKZN6__pstl13__par_backend22__parallel_stable_sortIRKNS3_9execution2v127parallel_unsequenced_policyEPN5tracy6Worker14ZoneThreadDataEZZNSC_C4ERNSB_8FileReadENSB_9EventType4TypeEbENKUlvE1_clEvEUlRKT_RKT0_E5_ZZNS3_10__internal14__pattern_sortISA_SE_SQ_St17integral_constantIbLb1EEEEvOSK_SN_SN_T1_T2_SU_SU_ENKUlvE_clEvEUlSE_SE_SQ_E_EEvSV_SN_SN_SW_SX_mEUlvE_vEclEv':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::Worker::Worker(tracy::FileRead&, tracy::EventType::Type, bool)::{lambda(auto:1 const&, auto:2 const&)#2}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#2}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#2}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#2})#1}>(std::integral_constant<bool, true>, tracy::SymbolLocation*, tracy::SymbolLocation*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::Worker(tracy::FileRead&, tracy::EventType::Type, bool)::{lambda(auto:1 const&, auto:2 const&)#2}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:86: undefined reference to `tbb::internal::allocate_via_handler_v3(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_root_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1145: undefined reference to `tbb::internal::allocate_root_proxy::allocate(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::Worker::Worker(tracy::FileRead&, tracy::EventType::Type, bool)::{lambda(auto:1 const&, auto:2 const&)#2}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#2}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#2}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#2})#1}>(std::integral_constant<bool, true>, tracy::SymbolLocation*, tracy::SymbolLocation*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::Worker(tracy::FileRead&, tracy::EventType::Type, bool)::{lambda(auto:1 const&, auto:2 const&)#2}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned int*, tracy::Worker::ReconstructMemAllocPlot()::{lambda(auto:1 const&, auto:2 const&)#1}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned int*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned int*, unsigned int*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(unsigned int*, unsigned int*, {lambda(auto:1 const&, auto:2 const&)#1})#1}>(std::integral_constant<bool, true>, unsigned int*, unsigned int*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::ReconstructMemAllocPlot()::{lambda(auto:1 const&, auto:2 const&)#1}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:86: undefined reference to `tbb::internal::allocate_via_handler_v3(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_root_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1145: undefined reference to `tbb::internal::allocate_root_proxy::allocate(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned int*, tracy::Worker::ReconstructMemAllocPlot()::{lambda(auto:1 const&, auto:2 const&)#1}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned int*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned int*, unsigned int*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(unsigned int*, unsigned int*, {lambda(auto:1 const&, auto:2 const&)#1})#1}>(std::integral_constant<bool, true>, unsigned int*, unsigned int*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::ReconstructMemAllocPlot()::{lambda(auto:1 const&, auto:2 const&)#1}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_additional_child_of_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: more undefined references to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const' follow
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `std::thread::_State_impl<std::thread::_Invoker<std::tuple<tracy::Worker::Worker(tracy::FileRead&, tracy::EventType::Type, bool)::{lambda()#3}> > >::_M_run()':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task_arena.h:216: undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&, long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tracy::Worker::ReconstructMemAllocPlot()':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task_arena.h:216: undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&, long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tracy::Worker::Worker(tracy::FileRead&, tracy::EventType::Type, bool)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task_arena.h:216: undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&, long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tracy::Worker::HandlePostponedPlots()':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task_arena.h:216: undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&, long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tracy::Worker::Exec()':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task_arena.h:216: undefined reference to `tbb::interface7::internal::isolate_within_arena(tbb::interface7::internal::delegate_base&, long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_additional_child_of_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::Worker::Exec()::{lambda(auto:1 const&, auto:2 const&)#5}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#5}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#5}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#5})#1}>(std::integral_constant<bool, true>, tracy::SymbolLocation*, tracy::SymbolLocation*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::Exec()::{lambda(auto:1 const&, auto:2 const&)#5}, unsigned long)::{lambda()#1} const, void>::operator()() const [clone .cold]':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::PlotItem*, tracy::Worker::HandlePostponedPlots()::{lambda(auto:1 const&, auto:2 const&)#1}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::PlotItem*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::PlotItem*, tracy::PlotItem*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(tracy::PlotItem*, tracy::PlotItem*, {lambda(auto:1 const&, auto:2 const&)#1})#1}>(std::integral_constant<bool, true>, tracy::PlotItem*, tracy::PlotItem*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::HandlePostponedPlots()::{lambda(auto:1 const&, auto:2 const&)#1}, unsigned long)::{lambda()#1} const, void>::operator()() const [clone .cold]':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `_ZNK3tbb10interface78internal18delegated_functionIKZN6__pstl13__par_backend22__parallel_stable_sortIRKNS3_9execution2v127parallel_unsequenced_policyEPN5tracy6Worker14ZoneThreadDataEZZNSC_C4ERNSB_8FileReadENSB_9EventType4TypeEbENKUlvE1_clEvEUlRKT_RKT0_E5_ZZNS3_10__internal14__pattern_sortISA_SE_SQ_St17integral_constantIbLb1EEEEvOSK_SN_SN_T1_T2_SU_SU_ENKUlvE_clEvEUlSE_SE_SQ_E_EEvSV_SN_SN_SW_SX_mEUlvE_vEclEv.cold':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::Worker::Worker(tracy::FileRead&, tracy::EventType::Type, bool)::{lambda(auto:1 const&, auto:2 const&)#2}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#2}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#2}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(tracy::SymbolLocation*, tracy::SymbolLocation*, {lambda(auto:1 const&, auto:2 const&)#2})#1}>(std::integral_constant<bool, true>, tracy::SymbolLocation*, tracy::SymbolLocation*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::Worker(tracy::FileRead&, tracy::EventType::Type, bool)::{lambda(auto:1 const&, auto:2 const&)#2}, unsigned long)::{lambda()#1} const, void>::operator()() const [clone .cold]':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned int*, tracy::Worker::ReconstructMemAllocPlot()::{lambda(auto:1 const&, auto:2 const&)#1}, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned int*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned int*, unsigned int*, {lambda(auto:1 const&, auto:2 const&)#1}, std::integral_constant<bool, true>, std::integral_constant, std::integral_constant)::{lambda()#1}::operator()() const::{lambda(unsigned int*, unsigned int*, {lambda(auto:1 const&, auto:2 const&)#1})#1}>(std::integral_constant<bool, true>, unsigned int*, unsigned int*, __pstl::execution::v1::parallel_unsequenced_policy const&, tracy::Worker::ReconstructMemAllocPlot()::{lambda(auto:1 const&, auto:2 const&)#1}, unsigned long)::{lambda()#1} const, void>::operator()() const [clone .cold]':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_additional_child_of_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1179: undefined reference to `tbb::internal::allocate_additional_child_of_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_child_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1171: undefined reference to `tbb::internal::allocate_child_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_continuation_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1163: undefined reference to `tbb::internal::allocate_continuation_proxy::allocate(unsigned long) const'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, std::less<unsigned long>, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, std::less<unsigned long>, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, unsigned long*, std::less<unsigned long>, std::integral_constant<bool, true>, std::integral_constant<bool, true>, std::integral_constant<bool, true>)::{lambda()#1}::operator()() const::{lambda(unsigned long*, unsigned long*, std::less<unsigned long>)#1}>(__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, unsigned long*, std::less<unsigned long>, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, std::less<unsigned long>, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, unsigned long*, std::less<unsigned long>, std::integral_constant<bool, true>, std::integral_constant<bool, true>, std::integral_constant<bool, true>)::{lambda()#1}::operator()() const::{lambda(unsigned long*, unsigned long*, std::less<unsigned long>)#1}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:86: undefined reference to `tbb::internal::allocate_via_handler_v3(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `operator new(unsigned long, tbb::internal::allocate_root_proxy const&)':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/task.h:1145: undefined reference to `tbb::internal::allocate_root_proxy::allocate(unsigned long)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o: in function `tbb::interface7::internal::delegated_function<__pstl::__par_backend::__parallel_stable_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, std::less<unsigned long>, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, std::less<unsigned long>, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, unsigned long*, std::less<unsigned long>, std::integral_constant<bool, true>, std::integral_constant<bool, true>, std::integral_constant<bool, true>)::{lambda()#1}::operator()() const::{lambda(unsigned long*, unsigned long*, std::less<unsigned long>)#1}>(__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, unsigned long*, std::less<unsigned long>, __pstl::__internal::__pattern_sort<__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, std::less<unsigned long>, std::integral_constant<bool, true> >(__pstl::execution::v1::parallel_unsequenced_policy const&, unsigned long*, unsigned long*, std::less<unsigned long>, std::integral_constant<bool, true>, std::integral_constant<bool, true>, std::integral_constant<bool, true>)::{lambda()#1}::operator()() const::{lambda(unsigned long*, unsigned long*, std::less<unsigned long>)#1}, unsigned long)::{lambda()#1} const, void>::operator()() const':
/nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: /nix/store/37v5czd0wr2q3m2l86xlci76a81x5x92-tbb-v2020.2/include/tbb/tbb_allocator.h:91: undefined reference to `tbb::internal::deallocate_via_handler_v3(void*)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro._ZTIN6__pstl13__par_backend12__merge_taskIPmS2_S2_St4lessImENS0_16__serial_destroyENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE[_ZTIN6__pstl13__par_backend12__merge_taskIPmS2_S2_St4lessImENS0_16__serial_destroyENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE]+0x10): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro._ZTIN6__pstl13__par_backend12__merge_taskIPmS2_S2_St4lessImENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE[_ZTIN6__pstl13__par_backend12__merge_taskIPmS2_S2_St4lessImENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE]+0x10): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro._ZTIN6__pstl13__par_backend12__merge_taskIPmS2_S2_St4lessImENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E1_ZNSO_7executeEvEUlS2_S2_S2_E2_EEEE[_ZTIN6__pstl13__par_backend12__merge_taskIPmS2_S2_St4lessImENS0_14__binary_no_opENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E1_ZNSO_7executeEvEUlS2_S2_S2_E2_EEEE]+0x10): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x10): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x28): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x40): more undefined references to `typeinfo for tbb::task' follow
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x190): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x1c0): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x1f0): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x220): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x250): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x280): more undefined references to `tbb::task::note_affinity(unsigned short)' follow
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x578): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x5a0): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x5b8): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x5d0): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x5e8): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x690): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x6c0): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x6f0): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x720): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro+0x750): undefined reference to `tbb::task::note_affinity(unsigned short)'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro._ZTVN6__pstl13__par_backend12__merge_taskIPmS2_S2_St4lessImENS0_16__serial_destroyENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE[_ZTVN6__pstl13__par_backend12__merge_taskIPmS2_S2_St4lessImENS0_16__serial_destroyENS0_19__serial_move_mergeIZNS0_18__stable_sort_taskIS2_S2_S4_ZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SJ_T1_T2_SG_SG_ENKUlvE_clEvEUlS2_S2_S4_E_E7executeEvEUlS2_S2_E_ZNSO_7executeEvEUlS2_S2_S2_E0_EEEE]+0x28): more undefined references to `tbb::task::note_affinity(unsigned short)' follow
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro._ZTIN6__pstl13__par_backend18__stable_sort_taskIPmS2_St4lessImEZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SG_T1_T2_SD_SD_ENKUlvE_clEvEUlS2_S2_S4_E_EE[_ZTIN6__pstl13__par_backend18__stable_sort_taskIPmS2_St4lessImEZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SG_T1_T2_SD_SD_ENKUlvE_clEvEUlS2_S2_S4_E_EE]+0x10): undefined reference to `typeinfo for tbb::task'
/nix/store/nyhj00w339gk2gaj3faz70gjrnbmam8v-binutils-2.31.1/bin/ld: obj/debug/o/o/o/../../../server/TracyWorker.o:(.data.rel.ro._ZTVN6__pstl13__par_backend18__stable_sort_taskIPmS2_St4lessImEZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SG_T1_T2_SD_SD_ENKUlvE_clEvEUlS2_S2_S4_E_EE[_ZTVN6__pstl13__par_backend18__stable_sort_taskIPmS2_St4lessImEZZNS_10__internal14__pattern_sortIRKNS_9execution2v127parallel_unsequenced_policyES2_S4_St17integral_constantIbLb1EEEEvOT_T0_SG_T1_T2_SD_SD_ENKUlvE_clEvEUlS2_S2_S4_E_EE]+0x28): undefined reference to `tbb::task::note_affinity(unsigned short)'
collect2: error: ld returned 1 exit status
make[1]: *** [build.mk:73: Tracy-debug] Error 1
make[1]: Leaving directory '/home/andy/Downloads/tracy/profiler/build/unix'
make: *** [Makefile:4: debug] Error 2

I have tried TBB versions:

  • 2018_U6
  • 2019_U9
  • v2020.2

Which version is tracy intended to be built with?

Thanks for the help.

C++ 17 requirement for VS is unnecessary

TracyWorker makes use of initializer lists in structures which inherit from other structures. This isn't supported in Visual Studio until C++ 17, and apparently only on VS 2019. VS 2017 doesn't seem to support it properly. This requirement feels a bit arbitrary because if I replace with a simple constructor for the code, it builds and executes properly as C++ 11 on VS 2017.

Example error:
TracyWorker.cpp(284,35): error C2440: 'initializing': cannot convert from 'initializer list' to 'tracy::SourceLocation'

There's only 3 errors total so it should be relatively easy to switch back.

'___tracy_scoped_zone': redefinition; multiple initialization

Hey,

I am looking into integrating tracy into clausewitz, the engine used by all Paradox Development Studio games. It looks very useful, but I ran into the issue where defining a scoped zone multiple times in a function will cause issues.

I think this can be easily solved by adding the line number to the variable name, the source location already has that. Do you want me to make a pull request?

Missing capstone in windows build

Hi, I had to install capstone via vcpkg to build on windows 10 with visual studio 2019.
vcpkg.exe install --triplet x64-windows-static capstone

Possibility to improve macOS support?

First of all, I would say thank you for your amazing job! I always wanted to profile my code and never find the Swiss Army knife for that (CPU / GPU / memory / performance per line of code).

I read the manual and look in the code of the master branch to understand the limitations/restrictions for macOS.

I would like to have your opinion about the following points to know if they can be improved/fixed:

  • TRACY_NO_EXIT/ Profiling is interrupted when the application exits : Is this a limitation in the macOS architecture or do you think it might have a workaround/improvement to fix this?
  • Crash handler not available: Is it because this is not a priority for you (due to the limitation below plus the problem with OpenGL which can be profiled), or is it for any other reason?

Support for Start/Close of a Zone

Hi,

Looking at the Zone-API all I see is starting of zones and implicit closing at the end of a scope. I would like to have a bit more control of being able say ZoneStartName(name) and then a matching ZoneEndName(name).

When profiling larger functions I find it ugly to wrap every subpart in scopes to use it with ZoneNamed and it often just plain is in the way.

Can tracy profile GPU on Android ?

HI, Can tracy profile GPU on Android ?

I've added TracyGpuContext and TracyGpuNamedZone at the code, but it doesn't work.
After breakpoints, it is found that the code is executed, There was no error.
On the server profiler, it just shows OpenGL context 0 with empty GPU zones.

Custom source location macros

Hi,

One of the changes I have to do to integrate tracy in my company was to improve the client __FUNCTION__ based source location by constexpr-processing __PRETTY_FUNCTION__ to get full qualified function names. The issue is that this introduces a change that I have to manually patch whenever I want to update the profiler server to get the latest features and fixes.

I was thinking that maybe tracy could open the door for a bit of customization of source location by allowing users to provide their own alternatives:

constexpr std::string_view ParseFunctionName(std::string_view funcname)
{
    return ...;
}

#define TRAYC_SOURCE_LOCATION_FUNCTION \
    ParseFunctionName(__PRETTY_FUNCTION__).data()

#include <Tracy.hpp>

and tracy uses __FUNCTION__ by default (To keep the current behavior as default):

#ifndef TRACY_SOURCE_LOCATION_FUNCTION
    #define TRACY_SOURCE_LOCATION_FUNCTION __FUNCTION__
#endif

...

#define ZoneNamed( varname, active ) static const tracy::SourceLocationData TracyConcat(__tracy_source_location,__LINE__) { nullptr, TRACY_SOURCE_LOCATION_FUNCTION, ...)

The same could apply to the file and line info. With full customization users could decide using C++20 std::source_location (Or similar lib feature) if they want:

#define TRACY_SOURCE_LOCATION_FILE std::source_location::current().file_name()
#define TRACY_SOURCE_LOCATION_LINE std::source_location::current().line()
#define TRACY_SOURCE_LOCATION_FUNCTION std::source_location::current().function_name()

Would you be interested in a PR implementing this feature?
Thanks.

ImGuiColorTextEditor inside tracy namespace introduces bloat

We are using ImGuiColorTextEditor inside our project, and so is Tracy profiler. However, Tracy has included it inside the tracy namespace (profiler). This leads to it being required twice... inside and outside the namespace so that we may use it or tracy may use it.

You can see these changes to the ImGuiColorTextEditor project in the texteditor.h and texteditor.cpp.

Requesting this 3rd party lib be outside the tracy namespace so it may be included once... To include only the standard ImGuiColorTextEditor introduces a linker error that tracy cannot find it. You would still be able to ship the version you provide, but you would not conflict with folks using a competing equivalent library.

Any easy steps to compile it on ubuntu?

after extracting this zip
and also installing libtbb-dev
I did cd profiler/build/unix/;make
but no matter what version I use from 0.6 to 0.6.3 it always fails
as tbb was not even mentioned on the manual .pdf, and it let me compile more than before, now I feel lost...
has anyone compiled on ubuntu 18.04?

Tracy profiler release build crashes on MacOS

When I build Tracy/profiler on MacOS 10.15.4 with make release the result executable crashes on start ./Tracy-release. While debug executable built with make debug starts normally. I compared debug and release compilation flags and root caused it down to flag -fomit-frame-pointer. When this flag is removed Tracy-release starts normally on MacOS.

Support interruptable zones

Sometimes it's desirable to temporarily interrupt recording of execution time in a zone.

My use case is a scheduler that (among other things) handles control over to worker coroutines. With Tracy's current zone model, the scheduler zone would be a parent of all worker thread zones, but in my concrete use case I would prefer the worker thread zones to appear on the same level as the scheduler zone.

The scheduler code looks vaguely like this:

void Scheduler() {
    TracyCZone(SchedulerZone, true);
    while (true) {
        // ...
        // do some work
        // ...

        // invoke next worker
        // Proposed: TracyCZoneInterrupt(SchedulerZone)
        co_await worker_coroutine();
        // Proposed: TracyCZoneResume(SchedulerZone)
    }
}

With the current model, the scheduler zone would simply cover 100% of the program's execution time. With support for zone interruption, the profiler could properly display how much time is truly spent in the scheduler itself.

Tracy's internal API seems to already support this but there are no macros that expose this functionality: TracyCZoneInterrupt is equivalent to TracyCZoneEnd, and TracyCZoneResume is equivalent to ___tracy_emit_zone_begin (i.e. TracyCZone but without allocating a new context).

Control improvements for GPU traces

When working on my vulkan engine, i had some troubles with the ergonomy of the tracy Vulkan traces. The main issue i got is that encoding the samples can be very finnicky, with the samples having to be encoded after a command buffer has begun, and before a command buffer ends. The default scope-based sampling can bring big issues to it.

Another issue is that in many engines, people write a command encoder of sorts, which saves abstracted GPU commands, and then the actual GPU execution is done deferred later. This is completely incompatible with the current way the vulkan traces work.

For the "need more control" part, what ive done is a copy of tracy::VkCtxScope that does not use RAII for injecting the queries, but instead uses Start(VkCommandBuffer cmd), and End() functions. This allows to encode vulkan zones across queue submits.
Its used like this. (pseudocode)

VkCommandBuffer cmd = allocate_buffer();

TracyVkNamedManualZone(profilercontext, graphZone, cmd, "Framegraph", true);

vkBeginCommandBuffer(cmd, &beginInfo);


for(auto& pass : passes){
   graphZone.Begin(cmd); //begin the zone
   pass->encode_commands(cmd);
    graphZone.End(); //finish the zone before we submit

    submit_command(cmd);
    cmd = allocate_buffer(); //allocate another command 
}

For the encoding part, what ive done is to define a TracySourceLocation() macro that saves only the source location. It can then be used as this.

TracySourceLocation(sourceLoc, "Some pass", tracy::Color::Grey);

encoder->begin_trace(&sourceLoc);

The idea is that later down the line, when the commands are decoded, you can do this with it.

void Decode_BeginTrace(CommandDecodeState* state, CMD_BeginTrace* cmd)
{
	
       // grab the source location we encoded before
	const tracy::SourceLocationData* sourceloc =cmd->profilerSourceLocation;

	if (state->tracyScope == nullptr) {
		//allocate a new ManualScope and start it
		state->tracyScope = new tracy::VkCtxManualScope(profilerContext, sourceloc, state->cmd, true);
		state->tracyScope->Start(state->cmd);
	}
	else {
               //finish a ManualScope and then reset its source_location
		state->tracyScope->End();
		state->tracyScope->SetSourceLocation(sourceloc);
                state->tracyScope->Start(state->cmd);
	}
}

These changes are very minimal, and i can PR them if they sound useful.

View Artifacts with 0-Duration GPU Zones

When GPU zones with a duration of 0 (start == end) are present, they can cause themself and other zones to disappear if they are being shown in the profiler. Most of these artifacts can be avoided if a branch is commented out at TracyView.cpp:4142,

end = AdjustGpuTime( end, begin, drift );
const auto zsz = std::max( ( end - start ) * pxns, pxns * 0.5 );
//if( zsz < MinVisSize )
if (false)  // Bypass path where zones become 'squiggled out' for being too small on screen.
{
    int num = 0;
    const auto px0 = ( start - m_vd.zvStart ) * pxns;

The exact rules to reproduce these artifacts seems fairly involved, but here's some demoing to help explain the problem. Notice the "GPU execution time: 0 ns".
Without change: https://i.imgur.com/kpPyqsE.gifv
With change: https://i.imgur.com/dwaKaGf.gifv

The following trace can be used to reproduce the issue. Renamed the extension to comply with GitHub restrictions.
ZeroDurationGPUZones.txt

The messages window slows down tracy significantly when trace contains many messages

I have a trace that contains 1.8M messages (according to tracy's message window). With this many messages any operations involving the message window are very slow. Opening the window takes seconds, closing it also takes seconds. While the message window is open, the main trace view is not responsive either, however when it is closed, there's no perceptible performance impact on Tracy.

Interestingly the main trace view does not suffer from this problem and is able to display an arrow for each message and the message contents when the arrow is hovered over without much effort.

Let me know if you need more information and if so, what.

Release v0.7 Tracy.exe "illegal instruction"

tl;dr

Tracy.exe in v0.7 release requires your CPU to support AVX2, which is not documented in the README, nor the User Manual as far as I can tell.

Details about how difficult it was to discover this

When run via double-click, the precompiled binary, Tracy.exe, provided in the v0.7 release (note: I have not tested any prior release) silently fails and immediately terminates on my machine.

Of course the next thing I tried was running from a command line:
image

It took me a while to understand that this was referring to a literal assembly instruction rather than a Tracy-specific error, as I had never seen or heard of this before, nor does Windows make it terribly apparent that this is an exception.

I decided to clone the repo and compile the profiler/build/win32/Tracy.sln project myself to see if I could repro. Indeed, it immediately threw an illegal instruction exception at tracy_xxh3.h:625 which is this line in the xxHash3 source:

return v64 ^ (v64 >> shift);

I did some Googling and found this StackOverflow answer which states (with regard to an unrelated program):

As it turns out, the .sln file that came with the reconstruction code was set with AVX2, which was unsupported on my machine.

Going to Configuration Properties >> C/C++ >> Code Generation and setting "Enable Enhanced Instruction Set" to AVX solved the issue.

The assembly code now shows "SHL" instead of "SHLX," so the "illegal instruction" was the actual SHLX command not being available, not an issue with the parameters going into SHLX.

I verified the via the dissasembly that there was indeed a SHRX (shift right instead of left) instruction present, causing the exception.

As the SO user suggested, I changed the "Enable Enhanced Instruction Set" setting from Advanced Vector Extensions 2 (/arch:AVX2) to Advanced Vector Extensions (/arch:AVX) and recompiled. I can verify that Tracy.exe now starts and runs as expected.

I am running an Intel Core i5 2500K, but I suspect this issue will manifest in a similar way on any machine that does not support AVX2. I'm not certain if xxHash3 is your only dependency on AVX2, or if you're using it elsewhere. Either way, it would be very useful to provide guidance in the documentation about this dependency and how to change the project settings to support slightly older CPUs.

I'm not qualified to do any performance testing to understand exactly how this affects Tracy's performance, but there are likely existing benchmarks for xxHash3 if that is the only reason you're using AVX2.

Thanks for your time. This is a very intriguing project and the User Manual is a most excellent read.
-Dan

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.