大家好,又见面了,我是你们的朋友全栈君。
#include <stdio.h>
#include <setjmp.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <execinfo.h>
#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
#define DEBUG
#ifdef DEBUG
#define LOG(fmt,args...) printf("%s():%d " fmt, __FUNCTION__, __LINE__, ##args)
#else
#define LOG(fmt,args...)
#endif
extern void dump_backtrace(void);
#include "common.h"
void dump_backtrace(void)
{
int j, nptrs;
void *buffer[32];
char **strings;
nptrs = backtrace(buffer, ARRAY_SIZE(buffer) );
printf("backtrace() returned %d addresses:\n", nptrs);
strings = backtrace_symbols(buffer, nptrs);
if (NULL == strings)
{
perror("backtrace_symbols");
exit(-1);
}
for (j = 0; j < nptrs; j++)
{
printf(" %s\n", strings[j]);
}
free(strings);
}
#include "common.h"
void test()
{
*((int*)0x04) = 0;
}
void siginfo_handler(int signum, siginfo_t * siginfo, void * context)
{
LOG("Signal Number: %d\n", signum);
LOG("Address: %p\n", siginfo->si_addr);
dump_backtrace();
exit(-1);
}
int main()
{
int ret = 0;
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = siginfo_handler;
sigemptyset(&act.sa_mask);
ret = sigaction(SIGSEGV, &act, NULL);
if(0 != ret)
{
perror("sigaction() failed");
}
test();
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141285.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...