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);
}