mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-23 06:44:35 +00:00
Filename in callstack frame is not a persistent pointer.
This commit is contained in:
parent
56479b86fa
commit
88b1955a5a
@ -78,15 +78,21 @@ CallstackEntry DecodeCallstackPtr( uint64_t ptr )
|
|||||||
line.SizeOfStruct = sizeof( IMAGEHLP_LINE64 );
|
line.SizeOfStruct = sizeof( IMAGEHLP_LINE64 );
|
||||||
if( SymGetLineFromAddr64( proc, ptr, &displacement, &line ) == 0 )
|
if( SymGetLineFromAddr64( proc, ptr, &displacement, &line ) == 0 )
|
||||||
{
|
{
|
||||||
ret.file = "[unknown]";
|
line.FileName = "[unknown]";
|
||||||
ret.line = 0;
|
ret.line = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ret.file = line.FileName;
|
|
||||||
ret.line = line.LineNumber;
|
ret.line = line.LineNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto fsz = strlen( line.FileName );
|
||||||
|
auto file = (char*)tracy_malloc( fsz + 1 );
|
||||||
|
memcpy( file, line.FileName, fsz );
|
||||||
|
file[fsz] = '\0';
|
||||||
|
|
||||||
|
ret.file = file;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -565,6 +565,7 @@ void Profiler::SendCallstackFrame( uint64_t ptr )
|
|||||||
auto frame = DecodeCallstackPtr( ptr );
|
auto frame = DecodeCallstackPtr( ptr );
|
||||||
|
|
||||||
SendString( uint64_t( frame.name ), frame.name, QueueType::CustomStringData );
|
SendString( uint64_t( frame.name ), frame.name, QueueType::CustomStringData );
|
||||||
|
SendString( uint64_t( frame.file ), frame.file, QueueType::CustomStringData );
|
||||||
|
|
||||||
QueueItem item;
|
QueueItem item;
|
||||||
MemWrite( &item.hdr.type, QueueType::CallstackFrame );
|
MemWrite( &item.hdr.type, QueueType::CallstackFrame );
|
||||||
@ -577,6 +578,7 @@ void Profiler::SendCallstackFrame( uint64_t ptr )
|
|||||||
AppendData( &item, QueueDataSize[(int)QueueType::CallstackFrame] );
|
AppendData( &item, QueueDataSize[(int)QueueType::CallstackFrame] );
|
||||||
|
|
||||||
tracy_free( (void*)frame.name );
|
tracy_free( (void*)frame.name );
|
||||||
|
tracy_free( (void*)frame.file );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,8 +161,8 @@ static_assert( std::is_standard_layout<MemEvent>::value, "MemEvent is not standa
|
|||||||
|
|
||||||
struct CallstackFrame
|
struct CallstackFrame
|
||||||
{
|
{
|
||||||
uint64_t file;
|
|
||||||
StringIdx name;
|
StringIdx name;
|
||||||
|
StringIdx file;
|
||||||
uint32_t line;
|
uint32_t line;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2116,8 +2116,10 @@ void Worker::ProcessCallstackMemory( const QueueCallstackMemory& ev )
|
|||||||
void Worker::ProcessCallstackFrame( const QueueCallstackFrame& ev )
|
void Worker::ProcessCallstackFrame( const QueueCallstackFrame& ev )
|
||||||
{
|
{
|
||||||
auto fmit = m_data.callstackFrameMap.find( ev.ptr );
|
auto fmit = m_data.callstackFrameMap.find( ev.ptr );
|
||||||
auto it = m_pendingCustomStrings.find( ev.name );
|
auto nit = m_pendingCustomStrings.find( ev.name );
|
||||||
assert( it != m_pendingCustomStrings.end() );
|
assert( nit != m_pendingCustomStrings.end() );
|
||||||
|
auto fit = m_pendingCustomStrings.find( ev.file );
|
||||||
|
assert( fit != m_pendingCustomStrings.end() );
|
||||||
|
|
||||||
// Frames may be duplicated due to recursion
|
// Frames may be duplicated due to recursion
|
||||||
if( fmit == m_data.callstackFrameMap.end() )
|
if( fmit == m_data.callstackFrameMap.end() )
|
||||||
@ -2125,14 +2127,15 @@ void Worker::ProcessCallstackFrame( const QueueCallstackFrame& ev )
|
|||||||
CheckString( ev.file );
|
CheckString( ev.file );
|
||||||
|
|
||||||
auto frame = m_slab.Alloc<CallstackFrame>();
|
auto frame = m_slab.Alloc<CallstackFrame>();
|
||||||
frame->name = StringIdx( it->second.idx );
|
frame->name = StringIdx( nit->second.idx );
|
||||||
frame->file = ev.file;
|
frame->file = StringIdx( fit->second.idx );
|
||||||
frame->line = ev.line;
|
frame->line = ev.line;
|
||||||
|
|
||||||
m_data.callstackFrameMap.emplace( ev.ptr, frame );
|
m_data.callstackFrameMap.emplace( ev.ptr, frame );
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pendingCustomStrings.erase( it );
|
m_pendingCustomStrings.erase( nit );
|
||||||
|
m_pendingCustomStrings.erase( m_pendingCustomStrings.find( ev.file ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Worker::MemAllocChanged( int64_t time )
|
void Worker::MemAllocChanged( int64_t time )
|
||||||
|
Loading…
Reference in New Issue
Block a user