1515
1616extern " C" {
1717
18- __attribute__ ((weak)) bool SymbolizeCode(const std::string ModuleName,
18+ __attribute__ ((weak)) void SymbolizeCode(const char * ModuleName,
1919 uint64_t ModuleOffset,
20- std::string &Result);
20+ char *ResultString, size_t ResultSize,
21+ size_t *RetSize);
2122}
2223
2324namespace ur_sanitizer_layer {
@@ -49,7 +50,7 @@ void ParseBacktraceInfo(BacktraceInfo BI, std::string &ModuleName,
4950// Parse symbolizer output in the following formats:
5051// <function_name>
5152// <file_name>:<line_number>[:<column_number>]
52- SourceInfo ParseSymbolizerOutput (std::string Output) {
53+ SourceInfo ParseSymbolizerOutput (const std::string & Output) {
5354 SourceInfo Info;
5455 // Parse function name
5556 size_t End = Output.find_first_of (' \n ' );
@@ -98,8 +99,14 @@ void StackTrace::print() const {
9899 std::string ModuleName;
99100 uptr Offset;
100101 ParseBacktraceInfo (BI, ModuleName, Offset);
101- if (SymbolizeCode (ModuleName, Offset, Result)) {
102- SourceInfo SrcInfo = ParseSymbolizerOutput (std::move (Result));
102+ size_t ResultSize = 0 ;
103+ SymbolizeCode (ModuleName.c_str (), Offset, nullptr , 0 , &ResultSize);
104+ if (ResultSize) {
105+ std::vector<char > ResultVector (ResultSize);
106+ SymbolizeCode (ModuleName.c_str (), Offset, ResultVector.data (),
107+ ResultSize, nullptr );
108+ std::string Result ((char *)ResultVector.data ());
109+ SourceInfo SrcInfo = ParseSymbolizerOutput (Result);
103110 if (SrcInfo.file != " ??" ) {
104111 getContext ()->logger .always (" #{} in {} {}:{}:{}" , index,
105112 SrcInfo.function , SrcInfo.file ,
@@ -109,10 +116,10 @@ void StackTrace::print() const {
109116 SrcInfo.function , ModuleName,
110117 (void *)Offset);
111118 }
112- continue ;
113119 }
120+ } else {
121+ getContext ()->logger .always (" #{} {}" , index, BI);
114122 }
115- getContext ()->logger .always (" #{} {}" , index, BI);
116123 ++index;
117124 }
118125 getContext ()->logger .always (" " );
0 commit comments