如何打印堆栈

一、打印堆栈可以方便问题定位,找到具体的函数调用流程。

二、打印堆栈的方法

2.1、用户态

#include <stdio.h>
#include <stdlib.h> 
#include <stddef.h> 
#include <execinfo.h> 

#define DUMP_DEPTH	20

void dump(void) 
{ 
	int 	i 		= 0;
	size_t 	size	= 0;
	char **strings 	= NULL;
    void *buffer[DUMP_DEPTH] = {0};

    size = backtrace(buffer, DUMP_DEPTH);
    printf("get %zd stack frames\n", size);
    strings = backtrace_symbols(buffer, size);
    if (strings == NULL)
    {
        printf("backtrace_symbols error.");
        exit(-1);
    }

    for (i = 0; i < size; i++)
    {
        printf("%s\n", strings[i]);
    }
	
    free(strings);
    strings = NULL;
	
    exit(0);
}

void func_c()
{
	dump();
}

void func_b()
{
	func_c();
}

void func_a()
{
	func_b();
}

int main(int argc, const char *argv[])
{
	func_a();
	
	return 0;
}

运行结果

看不到具体的函数名调用关系,不用紧,可以使用addr2line解析出函数名,具体参考

https://blog.csdn.net/sydyh43/article/details/119487171 的4.2部分

PS:应用层coredump实现方式,创建SIGSEGV信号对应信号处理函数为dump,如:

signal(SIGSEGV, dump)

2.2、内核态

#include <linux/stacktrace.h>

#define BKTRACE_DEPTH        20

void print_stack(void)
{
	unsigned long backtrace[BKTRACE_DEPTH];
	struct stack_trace trace;

	memset(&trace, 0, sizeof(trace));
	memset(backtrace, 0, BKTRACE_DEPTH * sizeof(unsigned long));
	trace.max_entries = BKTRACE_DEPTH;
	trace.entries = backtrace;

//	save_stack_trace_tsk(ptask, &trace);	//指定task = pstak
	save_stack_trace(&trace);				//默认的task是current

	print_stack_trace(&trace, 0);
}

上面的实现方式堆栈深度可以按自己需求设置,其中默认堆栈深度,使用方法更方便。直接在需要的函数内插入下面的代码

dump_stack();

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android开发中,打印堆栈信息可以提供调试和错误排查的有力工具。以下是一种常用的方法来打印堆栈信息。 在代码中,我们可以使用Throwable类的printStackTrace方法来获得堆栈信息。例如: ``` try { // 可能会引发异常的代码 } catch (Exception e) { e.printStackTrace(); } ``` 这段代码会将异常的堆栈信息输出到Logcat中。如果你在IDE中运行你的代码,可以在Logcat窗口中查看到完整的堆栈信息,包括异常类型、异常出现的位置以及调用栈。 另外,我们也可以通过Log类的相关方法来打印堆栈信息。例如,在catch块中使用Log.e来输出异常的信息: ``` try { // 可能会引发异常的代码 } catch (Exception e) { Log.e("TAG", "出现异常:", e); } ``` 这样,异常信息会作为日志信息输出到Logcat中。通过指定TAG,你可以将这些日志筛选出来,方便查看和分析。 除了在Java代码中打印堆栈信息外,你还可以在任何时候使用adb命令来获取堆栈信息。例如,在终端中输入以下命令: ``` adb logcat -d | grep "Exception" ``` 这个命令会输出所有包含"Exception"关键字的日志信息,包括堆栈信息。 总结起来,打印堆栈信息是Android开发中非常有用的调试工具。通过在代码中使用printStackTrace或Log类的相关方法,以及使用adb命令,我们可以获取到异常发生的位置和调用栈信息,便于排查和定位错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值