Linux 信号
每个进程都需要有个信号处理函数,以捕捉异常信号。
我们在写代码时,有时会有内存非法使用,这种问题一般比较难定位。但是如果有信号处理函数,就可以在捕捉到SEGV信号后打印出详细信息以定位问题。
下面写一个简单的例子,来定位非法内存访问。
#include <stdio.h>
#define __USE_GNU
#include <ucontext.h>
#include <sys/prctl.h>
#include <execinfo.h>
#include <stdlib.h>
#include <sys/types.h>
#include <errno.h>
static void show_maps()
{
char cmd[128];
snprintf(cmd, sizeof(cmd), "cat /proc/%d/maps", getpid());
system(cmd);
}
static void show_backtrace()
{
void *trace[32];
int trace_size;
char **messages;
trace_size = backtrace(trace ,32);
int idx;
messages = backtrace_symbols(trace, trace_size);
if (NULL != messages)
{
for (idx = 0; idx < trace_size; idx++)
{
printf("%s\n", messages[idx]);
}
free(messages);
}
}
static void show_regs(mcontext_t *regs)
{
char comm[20] = {'\0'};
prctl(PR_GET_NAME, comm);
printf("PID:%d,comm:%20s\n", getpid(), comm);
printf("EIP:%p\n",(void*) regs->gregs[REG_EIP]);
}
static void sighandler(int signo, siginfo_t *info, void *context)
{
ucontext_t *uc = (ucontext_t *)context;
switch (signo)
{
case SIGSEGV :
printf("Invalid mem!!! Fault addr:%p\n",(void*)( info->si_addr));
show_regs(&(uc->uc_mcontext));
show_backtrace();
show_maps();
exit(0);
break;
default:
break;
}
}
int register_signalHandler()
{
struct sigaction sa;
int ret;
sa.sa_sigaction = &sighandler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
if (0 != sigaction(SIGSEGV, &sa, NULL))
{
printf("sigaction fail, errno:%d\n", errno);
return ret;
}
return 0;
}
void func()
{
printf("func!\n");
int *p;
*p = 8;
}
int main(void)
{
register_signalHandler();
func();
return 0;
}
在func函数中有个非法内存使用。
gcc -g signal.c -o signal
运行signal进程:

EIP寄存器地址在地址区间08048000~08049000是在进程的.text段。
我们可以通过addr2line进行定位:

76行正好是*p=8那一行。
如果SEGEV不是发生在进程的代码段,发生在某个so内。假如发生在0x7553654,而且so load到进程中的0xb7553000,那么addr2line应该查看地址0x654;
也可以在gdb中查看list *0x8048951

也可以反编译可执行文件,来查看地址。
Linux 信号的更多相关文章
- Linux信号类型说明
说明 在Linux系统开发中经常要使用到信号来实现异步通知机制.而在Linux系统中信号有很多种,也不用全部记住,学习几种常见的信号,学会使用即可:当然也要知道用哪种方式能够发送这样的信号. 查看li ...
- Linux信号基础
Linux信号基础 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux进程基础一文中已经提到,Linux以进程为单位来 ...
- Linux信号(signal) 机制分析
Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...
- 利用linux信号机制调试段错误(Segment fault)
在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...
- Linux信号实践(2) --信号分类
信号分类 不可靠信号 Linux信号机制基本上是从UNIX系统中继承过来的.早期UNIX系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,它的主要问题是: 1.进程每次处理信号后,就将对信号 ...
- 非常好的一篇对linux信号(signal)的解析 (转载)【转】
转自:https://blog.csdn.net/return_cc/article/details/78845346 Linux信号(signal) 机制分析 转载至:https://www.cnb ...
- Linux 信号:signal 与 sigaction
0.Linux下查看支持的信号列表: france@Ubuntux64:~$ kill -l ) SIGHUP ) SIGINT ) SIGQUIT ) SIGILL ) SIGTRAP ) SIGA ...
- Linux信号机制
Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...
- python学习笔记——多进程间通信——Linux信号基础
1 信号的基本描述 Signal信号(其全程为软中断信号)是Linux系统编程中非常重要的概念,信号是异步进程中通信的一种方式. 作用是通知进程发生了异步事件.进程之间可以调用系统来传递信号, 本身内 ...
- linux信号Linux下Signal信号太详细了,终于找到了
linux信号Linux下Signal信号太详细了,终于找到了 http://www.cppblog.com/sleepwom/archive/2010/12/27/137564.html
随机推荐
- QCon 2015 阅读笔记 - 移动开发最佳实践
所有ppt下载地址:http://pan.baidu.com/s/1mg9o4TM 下面是移动开发实践部分的阅读笔记. 移动开发网络性能优化实践 - 陈浩然 (携程) 携程是非常标准的移动App架构, ...
- wxWidgets进度条
#include <wx/wx.h> #include <wx/progdlg.h> class myApp : public wxApp { public: bool OnI ...
- 【英语】Bingo口语笔记(5) - 英式和美式英语的发音区别
- 使用C#代码审批/转签K2 Blackpearl流程
转:http://www.cnblogs.com/dannyli/archive/2011/08/02/2125302.html 以下是使用代码审批.转签k2 blackpearl流程,初探K2 Bl ...
- GitHub的代码托管和使用方法
原文 GitHub托管 借助GitHub托管你的项目代码 PS:话说自己注册了GitHub都很久了,却没有怎么去弄,现在系统学习一下,也把自己的学习经历总结下来share给大家,希望大家都能把Git ...
- 把php.exe加入系统环境变量-使用命令行可快速执行PHP命令
有时候在执行长时间运行的脚本程序的时候,浏览器是架不住的.我们就可以使用CMD命令行或者LINUX命令行执行PHP程序 1.把PHP.EXE加入到环境变量,不用每次都进入到PHP的目录 ① 右击我的 ...
- free-jqGrid
PM> Install-Package free-jqGrid jqGrid 是一个用来显示网格数据的jQuery插件,通过使用jqGrid可以轻松实现前端页面与后台数据的ajax异步通信.文档 ...
- ISO-8859-1
ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号 ...
- 【加解密】关于DES加密算法的JAVA加密代码及C#解密代码
JAVA加密: package webdomain; import java.security.Key; import java.security.spec.AlgorithmParameterSpe ...
- STL map详细用法和make_pair函数
今天练习华为上机测试题,遇到了map的用法,看来博客http://blog.csdn.net/sprintfwater/article/details/8765034:感觉很详细,博主的其他内容也值得 ...