sigaction检测段错误示例[通俗易懂]

sigaction检测段错误示例[通俗易懂]#include#include#include#include#include#include#include#defineARRAY_SIZE(a)sizeof(a)/sizeof(a[0])#defineDEBUG#ifdefDEBUG #defineLOG(fmt,args…)printf(“%s():%d”fmt,__FUNC

大家好,又见面了,我是你们的朋友全栈君。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141285.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C#代码集

    C#代码集C#入门代码示例记录一、示例静态计算工具类1publicstaticclassCalculator2{3publicstaticdoubleAdd(doublea,doub

    2022年7月1日
    38
  • stl是什么_stl vector

    stl是什么_stl vectorSTL——stack

    2022年4月21日
    46
  • sdn和nfv是什么_他她它怎么区分

    sdn和nfv是什么_他她它怎么区分那到底什么是NFV(网络功能虚拟化),它和之前的SDN(Software-definedNetworking)软件定义网络概念是一回事吗?它们有什么区别?SDN-诞生于校园,成熟于数据中心:SDN初始于园区网络,一群研究者(斯坦福的达人们)在进行科研时发现,每次进行新的协议部署尝试时,都需要改变网络设备的软件,这让他们非常郁闷,于是乎,他们开始考虑让这些网络硬件设备可编程化,并且可以被集中的一个盒子所管理和控制,就这样,诞生了当今SDN的基本定义和元素·分离控制和转发的功能·

    2022年9月8日
    2
  • java如何生成uuid_前端生成uuid

    java如何生成uuid_前端生成uuidjavauuid

    2022年9月22日
    4
  • lea指令!「建议收藏」

    lea指令!「建议收藏」
    最近在看linux-0.11内核,看到lea这个指令,google搜索了一下,转给大家,一起学习@!
     
    先看这个这个语法格式吧:
    对AT&T来说,寻址方式比较怪异,但又非常简洁,语法格式如下:segreg:base_address(offset_address,index,size) ;例子movl%eax,label1(,$2,$4)movl%ebx,(label2,$2,)movl%ecx,(%esp)
    其效果为

    2025年7月27日
    2
  • 华为測试 公共子串计算

    华为測试 公共子串计算

    2022年2月7日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号