前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >遇到 Segmentation fault 你想到了什么?

遇到 Segmentation fault 你想到了什么?

作者头像
程序员小王
发布2021-06-25 20:14:43
2.1K0
发布2021-06-25 20:14:43
举报
文章被收录于专栏:架构说

问: Segmentation fault 可以用程序被捕获吗?

代码语言:javascript
复制
答:不能防不胜防:
换个问题:谈谈你段错误理解, 
如果是回答 core,非法地址, 说明还是处于青铜阶段,这是定义, 根本不知道背后和如何解决你没有回答。被套路了
  • 你回答定义,根本没扩展
  • 隐藏问题:java,C++ 程序的异常和系统的异常有什么区别?背后原理一样吗?

很多book提到,但是我根本联想,关联不起来,当时一片空白。

问:How to catch segmentation fault in Linux?

答:自定义信号处理函数。2个信号不能捕获。

  • int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

总结

  • 程序异常原理是:程序同步控制,实际就是setjump longjump
  • 信号原理:软件中断,特指由操作系统发出给应用的异步提示机制
  • A signal is an asynchronous notification The SIGSEGV signal is sent to a process when it makes an invalid virtual memory reference, or segmentation fault

代码

代码语言:javascript
复制
#include <iostream>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

void segfault_sigaction(int signal, siginfo_t *si, void *arg)
{
    printf("Caught segfault at address %p\n", si->si_addr);
    exit(0);
}
int main()
{
 struct sigaction sa;
 memset(&sa, 0, sizeof(struct sigaction));
 sigemptyset(&sa.sa_mask);
 sa.sa_sigaction = segfault_sigaction;
 sa.sa_flags   = SA_SIGINFO;

 //sigaction(SIGSEGV, &sa, NULL); //Segmentation fault
     sigaction(SIGSEGV, &sa, NULL); //Caught segfault at address (nil)
 try
 {
  int *x = 0;
  *x = 1234;
 }
 catch(...)
 {
  cout << "How to catch segmentation fault in Linux? no"; 
 }
 return 0;
}

塔山:

  • strace - trace system calls and signals
  • https://en.wikipedia.org/wiki/Segmentation_fault
  • 清华大学操作系统 wiki http://os.cs.tsinghua.edu.cn/oscourse/OS2019spring
  • https://blog.csdn.net/work_msh/article/details/8470277

每次问自己一下:

一、这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题

二、这个技术的优势和劣势分别是什么

三、这个技术适用的场景。任何技术都有其适用的场景,离开了这个场景

四、技术的组成部分和关键点。

五、技术的底层原理和关键实现

六、已有的实现和它之间的对比

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问: Segmentation fault 可以用程序被捕获吗?
  • 问:How to catch segmentation fault in Linux?
  • 总结
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档