`

关于linux的段错误(Segmentation fault)

 
阅读更多

1.Segmentation fault这个字符串在shell中是谁打印的?
这个字符串实际上是bash(或者别的shell)打印的,而不是当前出错的进程,也不是内核,参见bash源代码的WAITPID (-1, &status, 0))语句。因此如果在一个自己写的程序中不对子进程进程任何wait或者不捕捉子进程退出信号的话,即使是段错误也不会打印信息,正如下面的程序一样,程序将默默终止:
int main(int argc, char **argv)
{
        if (fork() == 0){
            int *ad = (int *)0;
            *ad = 1234;
        }
}
linux中内核或者标准库连这么严重的段错误都不处理,足以看出其机制和策略分离的特性,用户可以自己处理,然后如果父进程感兴趣的话就通知父进程处理,反正内核和底层库是不管的,如果进程本身不处理,那么进行默认处理,而这个默认处理就是退出出错进程,然后父进程如果想做点什么,它可以wait退出进程,然后从status中得到信息。
2.段错误信号是可以被捕获的,一旦捕获了,那么行为就可能是任意的,只有编写捕获钩子的家伙知道。
3.段错误的调试方法:产生core文件,然后gdb proname corename,输入where/bt
4.段错误有时很有用:如果你不明白backtrace和backtrace_symbols函数,在一个很大的代码中你怎么知道某一个函数在特定参数的情况下被什么地方调用,比如有一个函数:
void test(char *name, char *value, ...)
{
    ...
}
你不知道当name是"abc"的时候,什么地方调用了test,完全可以这样:
void test(char *name, char *value, ...)
{
    if (!strcmp(name, "abc")) {
        int *a = (int *)0;
        *a = 1234;
    }
    ...
}
然后用gdb调试core文件即可。
5.有的时候段错误很奇怪,很有可能是编译问题,比如是头文件的版本不对或者连接库不对导致的二进制不兼容引起的,将头文件整理好,库匹配正确之后,重新干净的编译。

 

转:http://blog.csdn.net/dog250/article/details/5735520

分享到:
评论

相关推荐

    Linux下的段错误Segmentationfault产生的原因及调试方法经典.pdf

    "Linux下的段错误Segmentationfault产生的原因及调试方法经典" 在 Linux 系统中,段错误(Segmentation fault)是一种常见的错误,它是指访问了错误的内存段,或者访问了没有权限的内存区域,或者根本不存在对应的...

    Linux环境下段错误(Segmentation fault)的产生原因及调试方法

    在Linux环境下,编程时经常会遇到一个让开发者头疼的问题——段错误(Segmentation fault)。这个问题通常是由于程序尝试访问其不应该访问或者无法访问的内存区域而触发的。本文将深入探讨段错误的原因以及如何在...

    C_C++中的段错误(Segmentation fault)[转] - 温柔的暴力 - 博客园1

    【C/C++中的段错误(Segmentation fault)】 在计算机编程中,特别是在使用C或C++这类低级语言时,段错误(Segmentation fault)是一个常见的运行时错误,它发生在程序试图访问其不应该访问的内存区域时。这些区域...

    Segmentation_fault_in_linux.pdf

    ### Linux环境下的编译段错误分析 #### 一、Segmentation Fault的概念 Segmentation fault,通常缩写为SIGSEGV,是一种在计算机软件运行过程中可能发生的特定错误条件。当一个程序试图访问它无权访问的内存位置,...

    collect2: fatal error: ld terminated with signal 11 [Segmentation fault], core d

    这个错误通常发生在尝试使用g++或gcc编译C++或C程序时,表明链接器ld在执行过程中遇到了内存访问错误,即段错误(Segmentation fault)。 段错误是由于程序试图访问其没有权限访问的内存地址导致的。在Linux系统中...

    Linux环境下段错误的产生原因及调试方法小结

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)。借此机会系统...

    Linux下的段错误产生的原因及调试方法

    段错误,即`Segmentation fault`,是在程序运行过程中由于非法访问内存所引发的一种错误。这种错误在Linux环境下非常常见,尤其对于使用C/C++这类需要手动管理内存的语言编写的应用程序来说更为普遍。本文将详细介绍...

    Linux下发生段错误时如何产生core文件

    在Linux操作系统中,当一个进程由于各种原因,如非法内存访问、除以零等,触发了段错误(Segmentation Fault)时,系统可以生成一种名为core dump的文件,记录程序崩溃时的内存状态和调用堆栈信息。这对于调试和诊断...

    Segmentation Fault错误原因总结 _ Sissy 婷婷 Blog1

    Segmentation Fault,通常简称为SIGSEGV,是Linux和其他类Unix操作系统中的一种错误,它发生在程序尝试访问其无权访问的内存区域时。这可能是由于多种原因造成的,如非法地址访问、指针越界、空指针解引用、内存泄漏...

    欧拉系统(openEuler-22.03)安装深信服EasyConnect软件提示segmentation fault解决方案

    本文将深入探讨一个特定的问题——如何解决在欧拉系统(openEuler-22.03)上安装深信服EasyConnect软件时出现的“segmentation fault”错误,并提供相应的解决方案。 首先,让我们了解一下欧拉系统。欧拉系统(open...

    Linux C段错误定位

    在Linux系统中,C语言编程时可能会遇到段错误(Segmentation Fault),这通常是由于非法内存访问、空指针解引用或栈溢出等错误引起的。为了解决这类问题,开发者需要能够有效地定位错误发生的点,以便修复代码。本文...

    linux c段错误处理

    段错误(Segmentation fault),通常简称为SIGSEGV,是计算机软件运行过程中的一种特定错误条件。当一个程序尝试访问其无权访问的内存位置,或者以不被允许的方式访问内存(比如试图写入只读区域或覆盖操作系统的一...

    qt 段错误 解决方案

    在编程领域,"段错误"(Segmentation Fault)是一个常见的运行时错误,通常发生在尝试访问内存空间时,程序试图访问的区域不在其被允许的内存段内。这可能包括访问未初始化的指针、越界数组访问、非法内存释放等。在...

    linux下段错误检查sigsegv

    在Linux操作系统中,"段错误"(Segmentation Fault)是一种常见的程序运行时错误,它通常表示程序试图访问其不应该访问的内存区域。本教程将详细解释如何在Linux环境下检查和定位段错误,以及如何利用提供的`sigsegv...

    linux段错误调试方法.pdf

    Linux 段错误调试方法 Linux 段错误是指访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问 0 地址。段错误的产生是因为访问的内存超出了系统所给这个程序的内存空间,这个...

    Linux段错误解释[归类].pdf

    在Linux操作系统中,段错误(Segmentation Fault)是一种常见的运行时错误,通常发生在程序试图访问其不应该访问的内存区域时。这种错误可能是由于非法指令、无效的内存访问、空指针解引用或越界数组访问等原因导致...

    Linux段错误.pdf

    在Linux系统中,段错误(Segmentation Fault)是一种常见的运行时错误,它发生在程序试图访问其内存空间中未被分配或不允许访问的内存区域时。根据提供的文件内容,我们可以提取出以下相关的知识点: 1. **段错误的...

    在不具备gdb环境的Linux系统上大致定位段错误位置

    当出现段错误时,Linux系统会向进程发送`SIGSEGV`信号,如果该信号没有被正确处理,则会导致进程终止,并显示“segmentation fault”错误消息。 #### 2. SIGSEGV信号处理函数 默认情况下,当程序接收到`SIGSEGV`...

Global site tag (gtag.js) - Google Analytics