Allow copying callstack to clipboard.

This commit is contained in:
Bartosz Taudul 2020-10-30 18:27:52 +01:00
parent 8b4e03486d
commit 7791654896

View File

@ -14,6 +14,7 @@
#include <mutex> #include <mutex>
#include <numeric> #include <numeric>
#include <random> #include <random>
#include <sstream>
#include <stddef.h> #include <stddef.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
@ -12927,6 +12928,80 @@ void View::DrawCallstackWindow()
ImGui::SetNextWindowSize( ImVec2( 1400, 500 ), ImGuiCond_FirstUseEver ); ImGui::SetNextWindowSize( ImVec2( 1400, 500 ), ImGuiCond_FirstUseEver );
ImGui::Begin( "Call stack", &show, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse ); ImGui::Begin( "Call stack", &show, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse );
auto& cs = m_worker.GetCallstack( m_callstackInfoWindow );
if( ClipboardButton() )
{
std::ostringstream s;
int fidx = 0;
int bidx = 0;
for( auto& entry : cs )
{
char buf[64*1024];
auto frameData = m_worker.GetCallstackFrame( entry );
if( !frameData )
{
sprintf( buf, "%3i. %p\n", fidx++, (void*)m_worker.GetCanonicalPointer( entry ) );
}
else
{
auto ptr = buf;
const auto fsz = frameData->size;
for( uint8_t f=0; f<fsz; f++ )
{
const auto& frame = frameData->data[f];
auto txt = m_worker.GetString( frame.name );
if( fidx == 0 && f != fsz-1 )
{
auto test = tracy::s_tracyStackFrames;
bool match = false;
do
{
if( strcmp( txt, *test ) == 0 )
{
match = true;
break;
}
}
while( *++test );
if( match ) continue;
}
bidx++;
if( f == fsz-1 )
{
ptr += sprintf( ptr, "%3i. ", fidx++ );
}
else
{
ptr += sprintf( ptr, "inl. " );
}
ptr += sprintf( ptr, "%s ", txt );
txt = m_worker.GetString( frame.file );
if( frame.line == 0 )
{
ptr += sprintf( ptr, "(%s)", txt );
}
else
{
ptr += sprintf( ptr, "(%s:%" PRIu32 ")", txt, frame.line );
}
if( frameData->imageName.Active() )
{
ptr += sprintf( ptr, " %s\n", m_worker.GetString( frameData->imageName ) );
}
else
{
ptr += sprintf( ptr, "\n" );
}
}
}
s << buf;
}
ImGui::SetClipboardText( s.str().c_str() );
}
ImGui::SameLine();
ImGui::TextUnformatted( ICON_FA_AT " Frame location:" ); ImGui::TextUnformatted( ICON_FA_AT " Frame location:" );
ImGui::SameLine(); ImGui::SameLine();
ImGui::PushStyleVar( ImGuiStyleVar_FramePadding, ImVec2( 0, 0 ) ); ImGui::PushStyleVar( ImGuiStyleVar_FramePadding, ImVec2( 0, 0 ) );
@ -12938,7 +13013,6 @@ void View::DrawCallstackWindow()
ImGui::SameLine(); ImGui::SameLine();
ImGui::RadioButton( "Symbol address", &m_showCallstackFrameAddress, 2 ); ImGui::RadioButton( "Symbol address", &m_showCallstackFrameAddress, 2 );
auto& cs = m_worker.GetCallstack( m_callstackInfoWindow );
if( m_worker.AreCallstackSamplesReady() ) if( m_worker.AreCallstackSamplesReady() )
{ {
auto frame = m_worker.GetCallstackFrame( *cs.begin() ); auto frame = m_worker.GetCallstackFrame( *cs.begin() );