Abseil 的 GetStackTrace 函数不返回任何内容


void show_stackframe() {
std::cout << "Show stack frame function from Abseil." << std::endl;
void *trace[100];

int i, trace_size = 0;
trace_size = absl::GetStackTrace(trace, 100, 0);
printf("[bt] Execution path: %dn", trace_size);
for (i=0; i<trace_size; ++i)
{
printf("[bt] %sn", (char*)trace[i]);
}
}

我在一个大型代码库的某一点上使用这个函数get stacktrace。我知道一个事实,我试图获得堆栈跟踪的点是在10个函数调用深度(以前我在这一点上造成了分段错误,我使用GDB查看堆栈跟踪)。然而,我根本没有得到堆栈跟踪。也就是说,Abseil返回的trace_size是0。为什么这不起作用?

是因为我试图获得堆栈跟踪的点是在线程内吗?这在多线程环境中不能工作吗?

absl::GetStackTrace只返回代码地址(程序计数器),它不是函数名,所以你不能做printf("%s")的东西,如果它是一个字符串。要将代码地址转换为函数名,需要类似于symbol的东西,代码来自https://clickhouse.com/codebrowser/ClickHouse/contrib/abseil-cpp/absl/debugging/symbolize_elf.inc.html#_ZN4absl12lts_202111029SymbolizeEPKvPci:

bool Symbolize(const void *pc, char *out, int out_size) {
// Symbolization is very slow under tsan.
ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN();
SAFE_ASSERT(out_size >= 0);
debugging_internal::Symbolizer *s = debugging_internal::AllocateSymbolizer();
const char *name = s->GetSymbol(pc);
bool ok = false;
if (name != nullptr && out_size > 0) {
strncpy(out, name, out_size);
ok = true;
if (out[out_size - 1] != '') {
// strncpy() does not '' terminate when it truncates.  Do so, with
// trailing ellipsis.
static constexpr char kEllipsis[] = "...";
int ellipsis_size =
std::min(implicit_cast<int>(strlen(kEllipsis)), out_size - 1);
memcpy(out + out_size - ellipsis_size - 1, kEllipsis, ellipsis_size);
out[out_size - 1] = '';
}
}
debugging_internal::FreeSymbolizer(s);
ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END();
return ok;
}

最新更新