From 0d209b80f4c7a4f0df154151c60d95467dacc553 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Wed, 30 Sep 2020 16:32:34 +0200 Subject: [PATCH] Show call stack in failure dialog. --- server/TracyView.cpp | 129 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/server/TracyView.cpp b/server/TracyView.cpp index f9fb4d3b..7f5668dd 100644 --- a/server/TracyView.cpp +++ b/server/TracyView.cpp @@ -431,6 +431,135 @@ bool View::Draw() ImGui::SameLine(); ImGui::TextDisabled( "(%s)", RealToString( data.thread ) ); } + if( data.callstack != 0 ) + { + if( ImGui::TreeNode( "Call stack" ) ) + { + ImGui::BeginChild( "##callstackFailure", ImVec2( 1200, 500 ) ); + const auto w = ImGui::GetWindowWidth(); + ImGui::Columns( 4 ); + ImGui::SetColumnWidth( 0, w * 0.05f ); + ImGui::SetColumnWidth( 1, w * 0.425f ); + ImGui::SetColumnWidth( 2, w * 0.425f ); + ImGui::SetColumnWidth( 3, w * 0.1f ); + ImGui::TextUnformatted( "Frame" ); + ImGui::NextColumn(); + ImGui::TextUnformatted( "Function" ); + ImGui::SameLine(); + s_instance->DrawHelpMarker( "Click on entry to copy it to clipboard." ); + ImGui::NextColumn(); + ImGui::TextUnformatted( "Location" ); + ImGui::SameLine(); + s_instance->DrawHelpMarker( "Click on entry to copy it to clipboard." ); + ImGui::NextColumn(); + ImGui::TextUnformatted( "Image" ); + ImGui::NextColumn(); + + auto& cs = s_instance->m_worker.GetCallstack( data.callstack ); + int fidx = 0; + int bidx = 0; + for( auto& entry : cs ) + { + auto frameData = s_instance->m_worker.GetCallstackFrame( entry ); + if( !frameData ) + { + ImGui::Separator(); + ImGui::Text( "%i", fidx++ ); + ImGui::NextColumn(); + char buf[32]; + sprintf( buf, "%p", (void*)s_instance->m_worker.GetCanonicalPointer( entry ) ); + ImGui::TextUnformatted( buf ); + if( ImGui::IsItemClicked() ) + { + ImGui::SetClipboardText( buf ); + } + ImGui::NextColumn(); + ImGui::NextColumn(); + ImGui::NextColumn(); + } + else + { + const auto fsz = frameData->size; + for( uint8_t f=0; fdata[f]; + auto txt = s_instance->m_worker.GetString( frame.name ); + + if( fidx == 0 && f != fsz-1 ) + { + auto test = s_tracyStackFrames; + bool match = false; + do + { + if( strcmp( txt, *test ) == 0 ) + { + match = true; + break; + } + } + while( *++test ); + if( match ) continue; + } + + bidx++; + + ImGui::Separator(); + if( f == fsz-1 ) + { + ImGui::Text( "%i", fidx++ ); + } + else + { + TextDisabledUnformatted( "inline" ); + } + ImGui::NextColumn(); + { + ImGui::PushTextWrapPos( 0.0f ); + if( txt[0] == '[' ) + { + TextDisabledUnformatted( txt ); + } + else + { + ImGui::TextUnformatted( txt ); + } + ImGui::PopTextWrapPos(); + } + if( ImGui::IsItemClicked() ) + { + ImGui::SetClipboardText( txt ); + } + ImGui::NextColumn(); + ImGui::PushTextWrapPos( 0.0f ); + txt = s_instance->m_worker.GetString( frame.file ); + if( frame.line == 0 ) + { + TextDisabledUnformatted( txt ); + } + else + { + ImGui::TextDisabled( "%s:%i", txt, frame.line ); + } + if( ImGui::IsItemClicked() ) + { + ImGui::SetClipboardText( txt ); + } + ImGui::PopTextWrapPos(); + ImGui::NextColumn(); + if( frameData->imageName.Active() ) + { + TextDisabledUnformatted( s_instance->m_worker.GetString( frameData->imageName ) ); + } + ImGui::NextColumn(); + } + } + } + + ImGui::EndColumns(); + ImGui::EndChild(); + ImGui::TreePop(); + } + } ImGui::Separator(); if( ImGui::Button( "I understand" ) ) {