mirror of
https://github.com/wolfpld/tracy
synced 2025-04-30 12:53:51 +00:00
Fix crash when trying to open unavailable source file.
This commit is contained in:
parent
ce1c744de9
commit
8e9a701277
@ -415,6 +415,11 @@ void SourceView::OpenSymbol( const char* fileName, int line, uint64_t baseAddr,
|
|||||||
Disassemble( baseAddr, worker );
|
Disassemble( baseAddr, worker );
|
||||||
SelectLine( line, &worker, true, symAddr );
|
SelectLine( line, &worker, true, symAddr );
|
||||||
|
|
||||||
|
SelectViewMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SourceView::SelectViewMode()
|
||||||
|
{
|
||||||
if( !m_lines.empty() )
|
if( !m_lines.empty() )
|
||||||
{
|
{
|
||||||
if( !m_asm.empty() )
|
if( !m_asm.empty() )
|
||||||
@ -453,40 +458,49 @@ void SourceView::ParseSource( const char* fileName, const Worker& worker, const
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
FILE* f = fopen( view.SourceSubstitution( fileName ), "rb" );
|
FILE* f = fopen( view.SourceSubstitution( fileName ), "rb" );
|
||||||
assert( f );
|
if( f )
|
||||||
fseek( f, 0, SEEK_END );
|
|
||||||
sz = ftell( f );
|
|
||||||
fseek( f, 0, SEEK_SET );
|
|
||||||
if( sz > m_dataSize )
|
|
||||||
{
|
{
|
||||||
delete[] m_dataBuf;
|
fseek( f, 0, SEEK_END );
|
||||||
m_dataBuf = new char[sz];
|
sz = ftell( f );
|
||||||
m_dataSize = sz;
|
fseek( f, 0, SEEK_SET );
|
||||||
|
if( sz > m_dataSize )
|
||||||
|
{
|
||||||
|
delete[] m_dataBuf;
|
||||||
|
m_dataBuf = new char[sz];
|
||||||
|
m_dataSize = sz;
|
||||||
|
}
|
||||||
|
fread( m_dataBuf, 1, sz, f );
|
||||||
|
m_data = m_dataBuf;
|
||||||
|
fclose( f );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_file = nullptr;
|
||||||
}
|
}
|
||||||
fread( m_dataBuf, 1, sz, f );
|
|
||||||
m_data = m_dataBuf;
|
|
||||||
fclose( f );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_tokenizer.Reset();
|
if( m_file )
|
||||||
auto txt = m_data;
|
|
||||||
for(;;)
|
|
||||||
{
|
{
|
||||||
auto end = txt;
|
m_tokenizer.Reset();
|
||||||
while( *end != '\n' && *end != '\r' && end - m_data < sz ) end++;
|
auto txt = m_data;
|
||||||
m_lines.emplace_back( Line { txt, end, Tokenize( txt, end ) } );
|
for(;;)
|
||||||
if( *end == '\n' )
|
|
||||||
{
|
{
|
||||||
end++;
|
auto end = txt;
|
||||||
if( end - m_data < sz && *end == '\r' ) end++;
|
while( *end != '\n' && *end != '\r' && end - m_data < sz ) end++;
|
||||||
|
m_lines.emplace_back( Line { txt, end, Tokenize( txt, end ) } );
|
||||||
|
if( *end == '\n' )
|
||||||
|
{
|
||||||
|
end++;
|
||||||
|
if( end - m_data < sz && *end == '\r' ) end++;
|
||||||
|
}
|
||||||
|
else if( *end == '\r' )
|
||||||
|
{
|
||||||
|
end++;
|
||||||
|
if( end - m_data < sz && *end == '\n' ) end++;
|
||||||
|
}
|
||||||
|
if( end - m_data == sz ) break;
|
||||||
|
txt = end;
|
||||||
}
|
}
|
||||||
else if( *end == '\r' )
|
|
||||||
{
|
|
||||||
end++;
|
|
||||||
if( end - m_data < sz && *end == '\n' ) end++;
|
|
||||||
}
|
|
||||||
if( end - m_data == sz ) break;
|
|
||||||
txt = end;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1093,6 +1107,7 @@ void SourceView::RenderSymbolView( const Worker& worker, View& view )
|
|||||||
ParseSource( file, worker, view );
|
ParseSource( file, worker, view );
|
||||||
m_targetLine = line;
|
m_targetLine = line;
|
||||||
SelectLine( line, &worker, true );
|
SelectLine( line, &worker, true );
|
||||||
|
SelectViewMode();
|
||||||
}
|
}
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
ImGui::NextColumn();
|
ImGui::NextColumn();
|
||||||
@ -2552,7 +2567,7 @@ void SourceView::RenderAsmLine( AsmLine& line, uint32_t ipcnt, uint32_t iptotal,
|
|||||||
ParseSource( fileName, worker, view );
|
ParseSource( fileName, worker, view );
|
||||||
m_targetLine = srcline;
|
m_targetLine = srcline;
|
||||||
SelectLine( srcline, &worker, false );
|
SelectLine( srcline, &worker, false );
|
||||||
m_displayMode = DisplayMixed;
|
SelectViewMode();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -145,6 +145,8 @@ private:
|
|||||||
void ParseSource( const char* fileName, const Worker& worker, const View& view );
|
void ParseSource( const char* fileName, const Worker& worker, const View& view );
|
||||||
bool Disassemble( uint64_t symAddr, const Worker& worker );
|
bool Disassemble( uint64_t symAddr, const Worker& worker );
|
||||||
|
|
||||||
|
void SelectViewMode();
|
||||||
|
|
||||||
void RenderSimpleSourceView();
|
void RenderSimpleSourceView();
|
||||||
void RenderSymbolView( const Worker& worker, View& view );
|
void RenderSymbolView( const Worker& worker, View& view );
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user