#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf sigsegv_buf; void sigsegv_callback(int sig_num){
printf("recieve a segment fault signal! [%d]\n", sig_num);
longjmp(sigsegv_buf, );
return;
}
void vulfunc(){
char dest[];
printf("into vulfunc\n");
strcpy(dest, "deadbeefdeadbeefdeadbeefdeadbeef");
printf("%s\n", dest);
return;
} int main(){
bsd_signal(SIGSEGV, sigsegv_callback);
int res;
res = setjmp(sigsegv_buf);
if(res==){
vulfunc();
}else if(res==){
printf("recovered from segment fault!\n");
}
printf("end\n");
if(res!=){
exit();
}
return ;
}

一个缓冲区溢出函数,导致segment fault 出发异常后的捕获和处理。

  1. main函数中利用signal/bsd_signal函数注册异常处理函数 sigsegv_callback
  2. 用setjmp设置程序恢复点(保存寄存器状态)
  3. 调用vulfunc,发生溢出,导致segment fault
  4. 执行到sigsegv_callback
  5. 在sigsegv_callback中使用longjmp从保存的状态中恢复程序到setjmp的下一条指令,设置setjmp的返回值为非0
  6. setjmp返回的是longjmp中设置的非0值,从而跳转setjmp后面的另一分支。

在Android(native executable file和Java+jni )测试。

亦可参考:http://www.csl.mtu.edu/cs4411.ck/www/NOTES/non-local-goto/sig-1.html

使用signal、setjmp、longjmp进行Linux/Android C异常处理的更多相关文章

  1. setjmp/longjmp 使用

    C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转(通常情况下,很多人都建议不要使用goto语句,因为采用goto语句后,代码维护工作量加大).另外,C语言标准中还提供一种非局部跳转“n ...

  2. Linux setjmp longjmp

    /********************************************************************* * Linux setjmp longjmp * 说明: ...

  3. 函数 setjmp, longjmp, sigsetjmp, siglongjmp

    一,相关函数接口 1,setjmp,longjmp,sigsetjmp,siglongjmp   #include <setjmp.h> int setjmp(jmp_buf env); ...

  4. 热烈庆祝华清远见2014嵌入式系统(Linux&Android)开发就业培训课程全面升级

    近日,华清远见公开宣布:2014嵌入式系统 (Linux&Android)开发就业培训课程再次升级!据悉,华清远见如今已经持续10年,一直保持课程每年2次的更新的频率.华清远见的每 次课程更新 ...

  5. Linux/Android 性能优化工具 perf

    /***************************************************************************** * Linux/Android 性能优化工 ...

  6. Signal ()函数详细介绍 Linux函数

    http://blog.csdn.net/ta893115871/article/details/7475095 Signal ()函数详细介绍 Linux函数 signal()函数理解 在<s ...

  7. Signal ()函数详细介绍 Linux函数(转)

    Signal ()函数详细介绍 Linux函数 收藏人:紫火神兵     2012-09-27 | 阅:5659  转:22    |   来源   |  分享               signa ...

  8. setjmp/longjmp

    1.setjmp/longjmp属于传统的错误处理 2.setjmp/longjmp是对goto语句的补充,goto仅仅能实现局部跳转.setjmp/longjmp能够实现全局跳转 3.setjmp/ ...

  9. linux&android PPP 相关知识

    Linux&Android PPP相关FAQ   目录 Linux&Android PPP相关FAQ.. 1 一.         文档说明... 3 二.         常见调试技 ...

随机推荐

  1. VC_MFC水波纹控件,开源

    代码和效果图: https://github.com/wjx0912/MfcWaterEffect 集成以下5个文件即可: watereffect\DIB.hwatereffect\DIB.cppwa ...

  2. HTML、html

    1.HTTPS(超文本传输协议,HyperText Transfer Protocol)        超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息.HTTP协议以明文方式发 ...

  3. linux 中printf的使用

    linux 中printf的使用printf "helloworld\n"printf 中换行必须加上\n printf '%d %s\n' 1 "abc" c ...

  4. .NET微信通过授权获取用户的基本信息

    一.填写授权回调页面的域名 二.引导用户到指定的授权页面 例如:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID& ...

  5. NodeJs http.get 方法请求时间过长问题处理!

    NodeJs 获取网页内容 http.get 默认请求超时过长了,程序要卡死好一会. 根据网上资料现改造了一个带超时设置的获取网页内容方法. 主要方法使用 setTimeout 来超时, 代码如下: ...

  6. Shiro 整合SpringMVC 并且实现权限管理

    Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...

  7. Asp.net MVC中 Controller 与 View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...

  8. 安装 python psutil 包

    yum install python-pip 下载 psutil https://pypi.python.org/pypi?:action=display&name=psutil#downlo ...

  9. .net 中生成二维码的组件

    http://qrcodenet.codeplex.com/

  10. unity3d 镜头随鼠标移动

    using UnityEngine; using System.Collections; public class sheji : MonoBehaviour { public int speed = ...