C语言笔记 使用BackTrace查看调用堆栈

函数原型

int backtrace(void **buffer, int size);

返回调用堆栈

buffer :提供一个指针的数组

size :指定缓冲区的个数,即设置的调用深度

int : 返回实际返回的调用深度

每个地址指针由 函数名、地址偏移、返回地址组成

char **backtrace_symbols(void *const *buffer, int size);

字符串结果通过该API返回,会在该函数中malloc,由我们free

使用方法

	void Backtrace(std::vector<std::string>& bt, int size, int skip) {
		void** array = (void**)malloc((sizeof(void*) * size));
		size_t s = ::backtrace(array, size);

		char** strings = backtrace_symbols(array, s);
		if (strings == NULL) {
			SYLAR_LOG_ERROR(g_logger) << "backtrace_synbols error";
			return;
		}

		for (size_t i = skip; i < s; ++i) {
			bt.push_back(demangle(strings[i]));
		}

		free(strings);
		free(array);
	}

	std::string BacktraceToString(int size, int skip, const std::string& prefix) {
		std::vector<std::string> bt;
		Backtrace(bt, size, skip);
		std::stringstream ss;
		for (size_t i = 0; i < bt.size(); ++i) {
			ss << prefix << bt[i] << std::endl;
		}
		return ss.str();
	}

参考资料:

https://www.linuxidc.com/Linux/2012-11/73470p2.htm

https://blog.csdn.net/qq_28351465/article/details/82999140

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值