#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. JSBinding / About JSComponent and Serialization

    About JSComponent JSCompnent is a normal Unity script. It inherits from JSSerializer and JSSerialize ...

  2. java之OOP

    类中属性的默认值 1.数字类型(int,short,byte,long,float,double)的初始化默认值是0 2.boolean的初始化默认值是false 3.引用类型的初始化默认值是null ...

  3. c++读写二进制文件

    要读取文件必须包含<fstream>头文件,这里包含了C++读写文件的方法,可以使用fstream 类,这个类可以对文件进行读写操作.   1.打开文件.   打开文件可以有两种方式,第一 ...

  4. Nginx日志常用分析命令汇总 (转)

    三.常用日志分析命令 1.总请求数 1 wc -l access.log |awk '{print $1}' 2.独立IP数 1 awk '{print $1}' access.log|sort |u ...

  5. Android总结篇系列:Activity生命周期

    Android官方文档和其他不少资料都对Activity生命周期进行了详细介绍,在结合资料和项目开发过程中遇到的问题,本文将对Activity生命周期进行一次总结. Activity是由Activit ...

  6. zxing 一维码部分深入分析与实际应用,识别卡片数量,Android数卡器

    打算修改zxing 源码应用到其它方面,所以最近花了点时间阅读其源码,无意中找到这篇博客,条码扫描二维码扫描——ZXing android 简化源码分析 对过程的分析还是可以参考的.原作者给出的一个基 ...

  7. android.view.WindowLeaked

    08-30 13:17:05.645 25543-25543/com.tongyan.nanjing.subway E/WindowManager: android.view.WindowLeaked ...

  8. ADF_Controller系列3_通过创建ADF Menu作为页面向导(Part1)

    2015-02-15 Created By BaoXinjian

  9. HTC Vive开发笔记之手柄控制

    怎么安装设备,配置环境我就不说了,自行百度,教程很多也很简单.接下来说下Vive手柄的控制. 手柄是HTC Vive的重要交互手段,我们通过第一个图片应该对其有一个直观的了解了,总共是九个按钮: 第一 ...

  10. HoloLens开发笔记之Gesture input手势输入

    手势是HoloLens三个首要输入形式之一.一旦你使用凝视定位了一个全息图像,手势允许你与它交互.手势输入允许你使用手或者点击器原生地与全息图像交互. 手势之外,你也可以在应用中使用语音输入来交互. ...