diff --git a/server/TracySourceView.cpp b/server/TracySourceView.cpp index 23625913..6f258f0e 100644 --- a/server/TracySourceView.cpp +++ b/server/TracySourceView.cpp @@ -43,43 +43,48 @@ void SourceView::Open( const char* fileName, int line, uint64_t symAddr, const W if( m_file != fileName ) { m_file = fileName; - FILE* f = fopen( fileName, "rb" ); - fseek( f, 0, SEEK_END ); - const auto sz = ftell( f ); - fseek( f, 0, SEEK_SET ); - if( sz > m_dataSize ) - { - delete[] m_data; - m_data = new char[sz+1]; - m_dataSize = sz; - } - fread( m_data, 1, sz, f ); - m_data[sz] = '\0'; - fclose( f ); - m_lines.clear(); - auto txt = m_data; - for(;;) + if( fileName ) { - auto end = txt; - while( *end != '\n' && *end != '\r' && end - m_data < sz ) end++; - m_lines.emplace_back( Line { txt, end } ); - if( *end == '\n' ) + FILE* f = fopen( fileName, "rb" ); + fseek( f, 0, SEEK_END ); + const auto sz = ftell( f ); + fseek( f, 0, SEEK_SET ); + if( sz > m_dataSize ) { - end++; - if( *end == '\r' ) end++; + delete[] m_data; + m_data = new char[sz+1]; + m_dataSize = sz; } - else if( *end == '\r' ) + fread( m_data, 1, sz, f ); + m_data[sz] = '\0'; + fclose( f ); + + auto txt = m_data; + for(;;) { - end++; - if( *end == '\n' ) end++; + auto end = txt; + while( *end != '\n' && *end != '\r' && end - m_data < sz ) end++; + m_lines.emplace_back( Line { txt, end } ); + if( *end == '\n' ) + { + end++; + if( *end == '\r' ) end++; + } + else if( *end == '\r' ) + { + end++; + if( *end == '\n' ) end++; + } + if( *end == '\0' ) break; + txt = end; } - if( *end == '\0' ) break; - txt = end; } } + if( m_lines.empty() ) m_showAsm = true; if( !Disassemble( symAddr, worker ) ) m_showAsm = false; + assert( m_showAsm || !m_lines.empty() ); } bool SourceView::Disassemble( uint64_t symAddr, const Worker& worker ) @@ -130,7 +135,7 @@ bool SourceView::Disassemble( uint64_t symAddr, const Worker& worker ) void SourceView::Render( const Worker& worker ) { - if( !m_asm.empty() ) + if( !m_asm.empty() && !m_lines.empty() ) { if( SmallCheckbox( ICON_FA_MICROCHIP " Show assembly", &m_showAsm ) ) { @@ -143,9 +148,15 @@ void SourceView::Render( const Worker& worker ) m_targetLine = m_selectedLine; } } - ImGui::SameLine(); - ImGui::Spacing(); - ImGui::SameLine(); + } + if( !m_asm.empty() ) + { + if( !m_lines.empty() ) + { + ImGui::SameLine(); + ImGui::Spacing(); + ImGui::SameLine(); + } TextFocused( "Code size:", MemSizeToString( m_codeLen ) ); } diff --git a/server/TracyView.cpp b/server/TracyView.cpp index e5399846..2b8b85e2 100644 --- a/server/TracyView.cpp +++ b/server/TracyView.cpp @@ -194,7 +194,8 @@ void View::InitTextEditor( ImFont* font ) void View::SetTextEditorFile( const char* fileName, int line, uint64_t symAddr ) { - m_sourceViewFile = fileName; + assert( fileName || symAddr ); + m_sourceViewFile = fileName ? fileName : (const char*)~uint64_t( 0 ); m_sourceView->Open( fileName, line, symAddr, m_worker ); } @@ -11418,6 +11419,18 @@ void View::DrawStatistics() { SetTextEditorFile( file, line, v.symAddr ); } + else if( symlen != 0 ) + { + uint32_t len; + if( m_worker.GetSymbolCode( v.symAddr, len ) ) + { + SetTextEditorFile( nullptr, 0, v.symAddr ); + } + else + { + m_statBuzzAnim.Enable( v.symAddr, 0.5f ); + } + } else { m_statBuzzAnim.Enable( v.symAddr, 0.5f ); @@ -12636,12 +12649,15 @@ void View::DrawTextEditor() ImGui::SetNextWindowSize( ImVec2( 700, 800 ), ImGuiCond_FirstUseEver ); bool show = true; ImGui::Begin( "Source view", &show ); - TextColoredUnformatted( ImVec4( 1.f, 1.f, 0.2f, 1.f ), ICON_FA_EXCLAMATION_TRIANGLE ); - ImGui::SameLine(); - TextColoredUnformatted( ImVec4( 1.f, 0.3f, 0.3f, 1.f ), "The source file contents might not reflect the actual profiled code!" ); - ImGui::SameLine(); - TextColoredUnformatted( ImVec4( 1.f, 1.f, 0.2f, 1.f ), ICON_FA_EXCLAMATION_TRIANGLE ); - TextFocused( "File:", m_sourceViewFile ); + if( m_sourceViewFile != (const char*)~uint64_t( 0 ) ) + { + TextColoredUnformatted( ImVec4( 1.f, 1.f, 0.2f, 1.f ), ICON_FA_EXCLAMATION_TRIANGLE ); + ImGui::SameLine(); + TextColoredUnformatted( ImVec4( 1.f, 0.3f, 0.3f, 1.f ), "The source file contents might not reflect the actual profiled code!" ); + ImGui::SameLine(); + TextColoredUnformatted( ImVec4( 1.f, 1.f, 0.2f, 1.f ), ICON_FA_EXCLAMATION_TRIANGLE ); + TextFocused( "File:", m_sourceViewFile ); + } m_sourceView->Render( m_worker ); ImGui::End(); if( !show ) m_sourceViewFile = nullptr;