15
15
16
16
extern " C" {
17
17
18
- __attribute__ ((weak)) bool SymbolizeCode(const std::string ModuleName,
18
+ __attribute__ ((weak)) void SymbolizeCode(const char * ModuleName,
19
19
uint64_t ModuleOffset,
20
- std::string &Result);
20
+ char *ResultString, size_t ResultSize,
21
+ size_t *RetSize);
21
22
}
22
23
23
24
namespace ur_sanitizer_layer {
@@ -49,7 +50,7 @@ void ParseBacktraceInfo(BacktraceInfo BI, std::string &ModuleName,
49
50
// Parse symbolizer output in the following formats:
50
51
// <function_name>
51
52
// <file_name>:<line_number>[:<column_number>]
52
- SourceInfo ParseSymbolizerOutput (std::string Output) {
53
+ SourceInfo ParseSymbolizerOutput (const std::string & Output) {
53
54
SourceInfo Info;
54
55
// Parse function name
55
56
size_t End = Output.find_first_of (' \n ' );
@@ -98,8 +99,14 @@ void StackTrace::print() const {
98
99
std::string ModuleName;
99
100
uptr Offset;
100
101
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);
103
110
if (SrcInfo.file != " ??" ) {
104
111
getContext ()->logger .always (" #{} in {} {}:{}:{}" , index,
105
112
SrcInfo.function , SrcInfo.file ,
@@ -109,10 +116,10 @@ void StackTrace::print() const {
109
116
SrcInfo.function , ModuleName,
110
117
(void *)Offset);
111
118
}
112
- continue ;
113
119
}
120
+ } else {
121
+ getContext ()->logger .always (" #{} {}" , index, BI);
114
122
}
115
- getContext ()->logger .always (" #{} {}" , index, BI);
116
123
++index;
117
124
}
118
125
getContext ()->logger .always (" " );
0 commit comments