Ответ 1
Возможно, ваши проблемы могут быть функциями, которые вы используете. Ваш max_depth
в backtrace(..
) установлен в 16
. Это может быть слишком низким. Во всяком случае...
Это сообщение в блоге Трассировки стека С++ с GCC объясняют, как вы должны выполнять трассировки стека. В сумме,
#include <execinfo.h>
void print_trace(FILE *out, const char *file, int line)
{
const size_t max_depth = 100;
size_t stack_depth;
void *stack_addrs[max_depth];
char **stack_strings;
stack_depth = backtrace(stack_addrs, max_depth);
stack_strings = backtrace_symbols(stack_addrs, stack_depth);
fprintf(out, "Call stack from %s:%d:\n", file, line);
for (size_t i = 1; i < stack_depth; i++) {
fprintf(out, " %s\n", stack_strings[i]);
}
free(stack_strings); // malloc()ed by backtrace_symbols
fflush(out);
}
GCC также предоставляет доступ к С++ name (de) mangler. Есть некоторые довольно волосатые детали, чтобы узнать о владении памятью и взаимодействии с выходом трассировки стека требуется бит синтаксического анализа строк, но он сводится к замене вышеуказанной внутренней петли следующим образом:
#include <cxxabi.h>
...
for (size_t i = 1; i < stack.depth; i++) {
size_t sz = 200; // just a guess, template names will go much wider
char *function = static_cast(malloc(sz));
char *begin = 0, *end = 0;
// find the parentheses and address offset surrounding the mangled name
for (char *j = stack.strings[i]; *j; ++j) {
if (*j == '(') {
begin = j;
}
else if (*j == '+') {
end = j;
}
}
if (begin && end) {
*begin++ = '';
*end = '';
// found our mangled name, now in [begin, end)
int status;
char *ret = abi::__cxa_demangle(begin, function, &sz, &status);
if (ret) {
// return value may be a realloc() of the input
function = ret;
}
else {
// demangling failed, just pretend it a C function with no args
std::strncpy(function, begin, sz);
std::strncat(function, "()", sz);
function[sz-1] = '';
}
fprintf(out, " %s:%s\n", stack.strings[i], function);
}
else
{
// didn't find the mangled name, just print the whole line
fprintf(out, " %s\n", stack.strings[i]);
}
free(function);
}
На этом сайте больше информации (я не хотел копировать дословно), но, глядя на этот код, и вышеприведенный сайт должен найти вас на правильном пути.