Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/wolfpld/tracy.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartosz Taudul <wolf@nereid.pl>2021-11-27 18:41:27 +0300
committerBartosz Taudul <wolf@nereid.pl>2021-11-27 18:41:27 +0300
commit52eeddd63a73c902bfe0ed651d590c341375f74e (patch)
treedf6ad6aa1220cc24f5569f8c310b7bf1806b2bb7
parented25c27228342f815991dbf38bcb0355d07669b1 (diff)
Fix display of entry call stacks when inlines are present.
-rw-r--r--server/TracySourceView.cpp2
-rw-r--r--server/TracyView.cpp69
-rw-r--r--server/TracyView.hpp3
3 files changed, 57 insertions, 17 deletions
diff --git a/server/TracySourceView.cpp b/server/TracySourceView.cpp
index a0bf2355..ae666b2d 100644
--- a/server/TracySourceView.cpp
+++ b/server/TracySourceView.cpp
@@ -3222,7 +3222,7 @@ void SourceView::RenderAsmLine( AsmLine& line, const AddrStat& ipcnt, const Addr
}
else if( !stats.parents.empty() && ImGui::IsMouseClicked( 2 ) )
{
- view.ShowSampleParents( symAddrParents );
+ view.ShowSampleParents( symAddrParents, false );
}
}
diff --git a/server/TracyView.cpp b/server/TracyView.cpp
index e3075e54..6b3d6fb8 100644
--- a/server/TracyView.cpp
+++ b/server/TracyView.cpp
@@ -13613,9 +13613,9 @@ void View::DrawSamplesStatistics(Vector<SymList>& data, int64_t timeRange, Accum
{
ImGui::PushID( idx++ );
if( isKernel ) ImGui::PushStyleColor( ImGuiCol_Text, 0xFF8888FF );
- const auto clicked = ImGui::Selectable( name, m_sampleParents.symAddr == v.symAddr, ImGuiSelectableFlags_SpanAllColumns );
+ const auto clicked = ImGui::Selectable( name, m_sampleParents.withInlines && m_sampleParents.symAddr == v.symAddr, ImGuiSelectableFlags_SpanAllColumns );
if( isKernel ) ImGui::PopStyleColor();
- if( clicked ) ShowSampleParents( v.symAddr );
+ if( clicked ) ShowSampleParents( v.symAddr, true );
ImGui::PopID();
}
if( parentName )
@@ -13718,7 +13718,7 @@ void View::DrawSamplesStatistics(Vector<SymList>& data, int64_t timeRange, Accum
assert( v.count > 0 );
assert( symlen != 0 );
auto inSym = m_worker.GetInlineSymbolList( v.symAddr, symlen );
- assert( inSym != 0 );
+ assert( inSym != nullptr );
const auto symEnd = v.symAddr + symlen;
Vector<SymList> inSymList;
while( *inSym < symEnd )
@@ -13795,9 +13795,9 @@ void View::DrawSamplesStatistics(Vector<SymList>& data, int64_t timeRange, Accum
else
{
ImGui::PushID( idx++ );
- if( ImGui::Selectable( sn, m_sampleParents.symAddr == iv.symAddr, ImGuiSelectableFlags_SpanAllColumns ) )
+ if( ImGui::Selectable( sn, !m_sampleParents.withInlines && m_sampleParents.symAddr == iv.symAddr, ImGuiSelectableFlags_SpanAllColumns ) )
{
- ShowSampleParents( iv.symAddr );
+ ShowSampleParents( iv.symAddr, false );
}
ImGui::PopID();
}
@@ -13998,7 +13998,7 @@ void View::DrawCallstackTable( uint32_t callstack, bool globalEntriesButton )
ImGui::SameLine();
if( ImGui::Button( ICON_FA_DOOR_OPEN " Global entry statistics" ) )
{
- ShowSampleParents( frame->data[0].symAddr );
+ ShowSampleParents( frame->data[0].symAddr, true );
}
}
}
@@ -16105,9 +16105,43 @@ void View::DrawSampleParents()
ImGui::Begin( "Sample entry call stacks", &show, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse );
if( !ImGui::GetCurrentWindowRead()->SkipItems )
{
+ const SymbolStats* stats;
+ SymbolStats tmpss;
+
const auto symbol = m_worker.GetSymbolData( m_sampleParents.symAddr );
- const auto& stats = *m_worker.GetSymbolStats( m_sampleParents.symAddr );
- assert( !stats.parents.empty() );
+ if( symbol->isInline || !m_sampleParents.withInlines )
+ {
+ stats = m_worker.GetSymbolStats( m_sampleParents.symAddr );
+ }
+ else
+ {
+ tmpss = *m_worker.GetSymbolStats( m_sampleParents.symAddr );
+ const auto symlen = symbol->size.Val();
+ auto inSym = m_worker.GetInlineSymbolList( m_sampleParents.symAddr, symlen );
+ assert( inSym != nullptr );
+ const auto symEnd = m_sampleParents.symAddr + symlen;
+ while( *inSym < symEnd )
+ {
+ auto istat = m_worker.GetSymbolStats( *inSym++ );
+ if( !istat ) continue;
+ tmpss.incl += istat->incl;
+ tmpss.excl += istat->excl;
+ for( auto& v : istat->parents )
+ {
+ auto it = tmpss.parents.find( v.first );
+ if( it == tmpss.parents.end() )
+ {
+ tmpss.parents.emplace( v.first, v.second );
+ }
+ else
+ {
+ it->second += v.second;
+ }
+ }
+ }
+ stats = &tmpss;
+ }
+ assert( !stats->parents.empty() );
ImGui::PushFont( m_bigFont );
TextFocused( "Symbol:", m_worker.GetString( symbol->name ) );
@@ -16116,6 +16150,11 @@ void View::DrawSampleParents()
ImGui::SameLine();
TextDisabledUnformatted( "(inline)" );
}
+ else if( !m_sampleParents.withInlines )
+ {
+ ImGui::SameLine();
+ TextDisabledUnformatted( "(without inlines)" );
+ }
ImGui::PopFont();
TextDisabledUnformatted( "Location:" );
ImGui::SameLine();
@@ -16145,30 +16184,30 @@ void View::DrawSampleParents()
m_sampleParents.sel = std::max( m_sampleParents.sel - 1, 0 );
}
ImGui::SameLine();
- ImGui::Text( "%s / %s", RealToString( m_sampleParents.sel + 1 ), RealToString( stats.parents.size() ) );
+ ImGui::Text( "%s / %s", RealToString( m_sampleParents.sel + 1 ), RealToString( stats->parents.size() ) );
if( ImGui::IsItemClicked() ) ImGui::OpenPopup( "EntryCallStackPopup" );
ImGui::SameLine();
if( ImGui::SmallButton( " " ICON_FA_CARET_RIGHT " " ) )
{
- m_sampleParents.sel = std::min<int>( m_sampleParents.sel + 1, stats.parents.size() - 1 );
+ m_sampleParents.sel = std::min<int>( m_sampleParents.sel + 1, stats->parents.size() - 1 );
}
if( ImGui::BeginPopup( "EntryCallStackPopup" ) )
{
int sel = m_sampleParents.sel + 1;
ImGui::SetNextItemWidth( 120 * scale );
const bool clicked = ImGui::InputInt( "##entryCallStack", &sel, 1, 100, ImGuiInputTextFlags_EnterReturnsTrue );
- if( clicked ) m_sampleParents.sel = std::min( std::max( sel, 1 ), int( stats.parents.size() ) ) - 1;
+ if( clicked ) m_sampleParents.sel = std::min( std::max( sel, 1 ), int( stats->parents.size() ) ) - 1;
ImGui::EndPopup();
}
- Vector<decltype(stats.parents.begin())> data;
- data.reserve( stats.parents.size() );
- for( auto it = stats.parents.begin(); it != stats.parents.end(); ++it ) data.push_back( it );
+ Vector<decltype(stats->parents.begin())> data;
+ data.reserve( stats->parents.size() );
+ for( auto it = stats->parents.begin(); it != stats->parents.end(); ++it ) data.push_back( it );
pdqsort_branchless( data.begin(), data.end(), []( const auto& l, const auto& r ) { return l->second > r->second; } );
ImGui::SameLine();
ImGui::TextUnformatted( m_statSampleTime ? TimeToString( m_worker.GetSamplingPeriod() * data[m_sampleParents.sel]->second ) : RealToString( data[m_sampleParents.sel]->second ) );
ImGui::SameLine();
char buf[64];
- PrintStringPercent( buf, 100. * data[m_sampleParents.sel]->second / stats.excl );
+ PrintStringPercent( buf, 100. * data[m_sampleParents.sel]->second / stats->excl );
TextDisabledUnformatted( buf );
ImGui::SameLine();
ImGui::Spacing();
diff --git a/server/TracyView.hpp b/server/TracyView.hpp
index 9dbbb886..5085cbca 100644
--- a/server/TracyView.hpp
+++ b/server/TracyView.hpp
@@ -110,7 +110,7 @@ public:
const char* SourceSubstitution( const char* srcFile ) const;
- void ShowSampleParents( uint64_t symAddr ) { m_sampleParents.symAddr = symAddr; m_sampleParents.sel = 0; }
+ void ShowSampleParents( uint64_t symAddr, bool withInlines ) { m_sampleParents.symAddr = symAddr; m_sampleParents.sel = 0; m_sampleParents.withInlines = withInlines; }
const ViewData& GetViewData() const { return m_vd; }
@@ -774,6 +774,7 @@ private:
struct {
uint64_t symAddr = 0;
int sel;
+ bool withInlines = false;
} m_sampleParents;
std::vector<std::pair<int, int>> m_cpuUsageBuf;