入职腾讯以来,天天都很忙。今天难得清闲,借此机会记录一下前段时间搞的一个小功能,打印函数的调用堆栈。
什么是函数的调用堆栈?给你看一段代码你马上就明白了。
比如我在DecideAllTaskID中调用A,那么打log之后我们就可以看到LogBacktrace的堆栈回溯结果了。
以上就是堆栈回溯的结果了,前面两个null可能是符号表中没有找到符号。
话不多说,直接上堆栈回溯的代码:
extern "C"
{
struct BacktraceState
{
void** current;
void** end;
};
static _Unwind_Reason_Code UnwindCallback(struct _Unwind_Context* context, void* arg)
{
BacktraceState* state = static_cast<BacktraceState*>(arg);
uintptr_t pc = _Unwind_GetIP(context);
if (pc)
{
if (state->current == state->end)
{
return _URC_END_OF_STACK;
}
else
{
*state->current++ = reinterpret_cast<void*>(pc);
}
}
return _URC_NO_REASON;
}
static size_t CaptureBacktrace(void** buffer, size_t max)
{
Backtr