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: %d\n", trace_size);
for (i=0; i<trace_size; ++i)
{
printf("[bt] %s\n", (char*)trace[i]);
}
}
我在一个大型代码库的某个点上使用了这个函数getstacktrace(之前我在这一点上造成了一个分段错误,我使用GDB查看了堆栈跟踪。)但是我根本没有得到任何堆栈跟踪。也就是说,Abseil返回的trace_size是0。为什么这行不通?
这是因为我试图获取堆栈跟踪的点在线程内部吗?这在多线程环境中不起作用吗?
1条答案
按热度按时间hof1towb1#
absl::GetStackTrace只返回代码地址(程序计数器),而不是函数名,所以你不能像处理字符串一样处理printf(“%s”)。要将代码地址转换为函数名,你需要像Symbolize这样的东西,代码来自https://clickhouse.com/codebrowser/ClickHouse/contrib/abseil-cpp/absl/debugging/symbolize_elf.inc.html#_ZN4absl12lts_202111029SymbolizeEPKvPci: