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 if(stack_string_list !=
nullptr)
115 for(
int idx(0); idx < size; ++idx)
117 char const * stack_string(stack_string_list.get()[idx]);
118 stack_trace.push_back(stack_string);
156 if(stack_trace_depth > 0)
158 std::vector<void *> array;
159 array.resize(stack_trace_depth);
160 int const size(backtrace(&array[0], stack_trace_depth));
164 std::unique_ptr<
char *,
decltype(&::free)> stack_string_list(backtrace_symbols(&array[0], size), &::free);
165 for(
int idx(0); idx < size; ++idx)
167 char const * raw_stack_string(stack_string_list.get()[idx]);
175 std::string filename;
176 std::string raw_function_name;
182 char const * s(raw_stack_string);
183 char const * start(s);
191 filename = std::string(start, s - start);
204 raw_function_name = std::string(start, s - start);
234 addr = std::string(start, s - start);
248 std::string addr2line(
"eu-addr2line --pid="
249 + std::to_string(getpid())
252 std::unique_ptr<FILE, int(*)(FILE *)> p(popen(addr2line.c_str(),
"r"), &::pclose);
256 int const c(fgetc(p.get()));
284 if(!raw_function_name.empty())
291 result +=
" <no function name>";
302 stack_trace.push_back(std::string(raw_stack_string));
306 stack_trace.push_back(result);