104 if(stack_trace_depth > 0)
106 std::vector<void *> array;
107 array.resize(std::max(stack_trace_depth, 1'000));
108 int const size(backtrace(&array[0], stack_trace_depth));
112 std::unique_ptr<
char *,
decltype(&::free)> stack_string_list(backtrace_symbols(&array[0], size), &::free);
113 for(
int idx(0); idx < size; ++idx)
115 char const * stack_string(stack_string_list.get()[idx]);
116 stack_trace.push_back(stack_string);
153 if(stack_trace_depth > 0)
155 std::vector<void *> array;
156 array.resize(stack_trace_depth);
157 int const size(backtrace(&array[0], stack_trace_depth));
161 std::unique_ptr<
char *,
decltype(&::free)> stack_string_list(backtrace_symbols(&array[0], size), &::free);
162 for(
int idx(0); idx < size; ++idx)
164 char const * raw_stack_string(stack_string_list.get()[idx]);
172 std::string filename;
173 std::string raw_function_name;
179 char const * s(raw_stack_string);
180 char const * start(s);
188 filename = std::string(start, s - start);
201 raw_function_name = std::string(start, s - start);
231 addr = std::string(start, s - start);
245 std::string addr2line(
"eu-addr2line --pid="
246 + std::to_string(getpid())
249 std::unique_ptr<FILE, int(*)(FILE *)> p(popen(addr2line.c_str(),
"r"), &::pclose);
253 int const c(fgetc(p.get()));
281 if(!raw_function_name.empty())
288 result +=
" <no function name>";
299 stack_trace.push_back(std::string(raw_stack_string));
303 stack_trace.push_back(result);