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的小伙伴可能已经对那个黑底白字的框有些厌倦了,不妨加点颜色,增加加可读性.

    2022年6月20日
  • SAE J1939物理层

    SAE J1939物理层在SAEJ1939-11和ISO11898中对商用车使用的线束都是屏蔽双绞线,即为除了电源、地、CAN_H、CAN_L之外还有一个屏蔽线,并且所有ECU的屏蔽线都接到同一个地线上,一般接地点选择在网络的中央位置上。但是在实际使用中,多数整车厂使用的都是非屏蔽双绞线,比较而言,非屏蔽双绞线的EMC特性要差一些,在1939中正常使用屏蔽双绞线一路CAN网络上最多可以接入30个ECU,而对于非屏蔽双

    2022年5月22日
  • 【AI视野·今日NLP 自然语言处理论文速览 第十七期】Thu, 1 Jul 2021[通俗易懂]

    AI视野·今日CS.NLP自然语言处理论文速览Thu,1Jul2021Totally28papers????上期速览✈更多精彩请移步主页DailyComputationandLanguagePapersOnthePowerofSaturatedTransformers:AViewfromCircuitComplexityAuthorsWilliamMerrill,YoavGoldberg,RoySchwartz,NoahA.

    2022年4月15日
  • docker部署gitlab[通俗易懂]

    docker部署gitlab[通俗易懂]这篇文章用来记录下我在使用docker部署gitlab时候遇到的一些坑。先介绍下我的环境:阿里云的轻量应用服务器:2核4G(好像最低要求配置,之前用2核2G的部署,直接给内存溢出),centos7.6第一步:安装docker具体安装步骤参考的是docker官方文档,主要就几个步骤就可以完成安装。1、…

    2022年10月7日
  • c# 自定义配置文件[通俗易懂]

    c# 自定义配置文件[通俗易懂]c# 自定义配置文件

    2022年4月25日
  • pnp饱和状态条件_二极管的极性判别

    pnp饱和状态条件_二极管的极性判别1.截止状态:当b-e结反偏、零偏、浅正偏(指琐然正偏,似正向压降小于门槛电压)时Ib=0.Ic=Ice≈0,三极管截止,此时Rce内阻为无穷大,Vce约等于电源电压。  2.导通放大状态:当be正偏、bc反偏;且Vbe大于门槛电压时为导通放大状态,此时Vc>Vb>Ve.且Vbe=0.7V。导通后Rce减小,导通越深,Rce内阻越小.Vce越小。在放大状态,Ib能控制Ic.即具有电…

    2022年9月4日

发表回复

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

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