#ifdef _WIN32 # include #endif #include #include #include #include #include "../../server/tracy_benaphore.h" #include "../../server/TracyFileWrite.hpp" #include "../../server/TracyMemory.hpp" #include "../../server/TracyWorker.hpp" #include "getopt.h" void Usage() { printf( "Usage: capture -a address -o output.tracy\n" ); exit( 1 ); } int main( int argc, char** argv ) { #ifdef _WIN32 if( !AttachConsole( ATTACH_PARENT_PROCESS ) ) { AllocConsole(); SetConsoleMode( GetStdHandle( STD_OUTPUT_HANDLE ), 0x07 ); } #endif const char* address = nullptr; const char* output = nullptr; int c; while( ( c = getopt( argc, argv, "a:o:" ) ) != -1 ) { switch( c ) { case 'a': address = optarg; break; case 'o': output = optarg; break; default: Usage(); break; } } if( !address || !output ) Usage(); printf( "Connecting to %s...", address ); fflush( stdout ); tracy::Worker worker( address ); while( !worker.HasData() ) std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); printf( "\n" ); auto& lock = worker.GetMbpsDataLock(); while( worker.IsConnected() ) { lock.lock(); const auto mbps = worker.GetMbpsData().back(); const auto compRatio = worker.GetCompRatio(); lock.unlock(); if( mbps < 0.1f ) { printf( "\33[2K\r\033[36;1m%7.2f Kbps", mbps * 1000.f ); } else { printf( "\33[2K\r\033[36;1m%7.2f Mbps", mbps ); } printf( " \033[0m| Ratio: \033[36;1m%5.1f%% \033[0m| Real: \033[33;1m%7.2f Mbps \033[0m| Mem: \033[31;1m%.2f MB\033[0m", compRatio * 100.f, mbps / compRatio, tracy::memUsage.load( std::memory_order_relaxed ) / ( 1024.f * 1024.f ) ); fflush( stdout ); std::this_thread::sleep_for( std::chrono::milliseconds( 100 ) ); } printf( "\nSaving trace..." ); fflush( stdout ); auto f = tracy::FileWrite::Open( output ); if( f ) { worker.Write( *f ); printf( " \033[32;1mdone!\033[0m\n" ); } else { printf( " \033[31;1failed!\033[0m\n" ); } return 0; }