堆栈的打印方式

Lniux堆栈的打印函数方法(已测可用)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
#include <execinfo.h>

static void output_addrline(char addr[])
{
	char cmd[256];
	char line[256];
	char addrline[32]={0,};
	char *str1, *str2;
	FILE* file;

	str1 = strchr(addr,'[');
	str2 = strchr(addr, ']');
	if(str1 == NULL || str2 == NULL)
	{
		return;
	}	
	memcpy(addrline, str1 + 1, str2 -str1);
	snprintf(cmd, sizeof(cmd), "addr2line -e /proc/%d/exe %s ", getpid(), addrline);
	file = popen(cmd, "r");
	if(NULL != fgets(line, 256, file)) 
	{
		printf("%s\n", line);
	}
	pclose(file);	
}

void out_stack()
{
	void *array[32];
	size_t size;
	char **strings;
	int i;
	
	size = backtrace (array, 32);
	strings = backtrace_symbols (array, size);
	if (NULL == strings)
	{
		printf("backtrace_symbols\n");
		return ;
	}

	for (i = 0; i < size; i++)
	{
		printf("%s",strings[i]);
		output_addrline(strings[i]);	
	}

	free(strings);
}

Windows堆栈的打印函数方法(已测可用)

#include <windows.h>
#include <DbgHelp.h>
#include <WinBase.h>

void printStack()
{
	unsigned int   i;
	void         * stack[100];
	unsigned short frames;
	SYMBOL_INFO  * symbol;
	HANDLE         process;

	process = GetCurrentProcess();

	SymInitialize(process, NULL, TRUE);

	frames = CaptureStackBackTrace(0, 100, stack, NULL);
	symbol = (SYMBOL_INFO *)calloc(sizeof(SYMBOL_INFO) + 256 * sizeof(char), 1);
	symbol->MaxNameLen = 255;
	symbol->SizeOfStruct = sizeof(SYMBOL_INFO);

	for (i = 0; i < frames; i++)
	{
		SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol);
		printf("%i: %s - 0x%0X\n", frames - i - 1, symbol->Name, symbol->Address);
	}
	free(symbol);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值