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: %d\n", trace_size);
for (i=0; i<trace_size; ++i)
{
printf("[bt] %s\n", (char*)trace[i]);
}
}
我正在使用此功能在大型代码库中的某个点获得stackTrace。我知道一个事实,我试图在10个函数呼叫的情况下尝试获得stacktrace的点(以前我在这一点上造成了分割故障,我使用GDB看了堆栈跟踪。)但是,我没有堆栈 - 完全追溯。即,trace_size返回的trace_ize是0。为什么这不起作用?
是因为我试图获得堆栈跟踪的点是线程中的吗?这在多线程环境中不起作用吗?
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]);
}
}
I was using this function get stacktrace at a certain point in a large code base. I know for a fact that the point at which I am trying to get stacktrace at is at 10 function calls deep(Previously I caused a segmentation fault at this point and I looked the stack trace using GDB.) However I am getting no stack-trace back at all. I.e. the trace_size that Abseil is returning back is 0. Why is this not working?
Is it because the point at which I am trying to obtain a stack-trace is inside a thread? Does this not work in a multithreaded environment?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
absl :: getStackTrace仅返回代码地址(程序计数器),而不是函数名称,因此您不能像字符串一样执行printf(“%s”)内容。
要将代码地址转换为函数名称,您需要诸如symernize,来自 https://clickhouse.com/codebrowser/clickhouse/contrib/contrib/contrib/abseil-cpp/absl/debugging/symbolize_elf.inc.inc.html#_zn4absl12lts _20211111111111111029symbolizeepkvppcipciepkvppciepkvppciepkvppci
absl::GetStackTrace only return the code address(program counter), it's not the function name, so you cannot do printf("%s") stuff as if it's a string.
To convert code address to function name, you need something like Symbolize, code from https://clickhouse.com/codebrowser/ClickHouse/contrib/abseil-cpp/absl/debugging/symbolize_elf.inc.html#_ZN4absl12lts_202111029SymbolizeEPKvPci: