关于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.有的时候段错误很奇怪,很有可能是编译问题,比如是头文件的版本不对或者连接库不对导致的二进制不兼容引起的,将头文件整理好,库匹配正确之后,重新干净的编译。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271791

相关文章
|
Linux C语言 Python
Linux C-完美解决segmentation fault (core dumped)
在Linux下进行C语言编程时,遇到一个错误,网上说的都很复杂,看都看不懂,其实就是你对指针进行直接操作之前,没有对它进行分配地址空间。 所以在运行的时候,它不知道在那里操作(比如赋值,取值),所以才报了这个错误。
44412 0
|
安全 NoSQL Ubuntu
linux 添加用户useradd 段错误 (核心已转储)
在Linux系统中使用`useradd`命令添加用户时遇到“段错误 (核心已转储)”的问题,通常表明存在系统级或关键组件问题。可通过检查系统日志(如`/var/log/syslog`)和内核消息来定位错误。此外,还需检查并修复文件系统错误(使用`fsck`),确保关键配置文件未损坏,并更新系统包与安全补丁。使用内存检测工具(如memtest86+)排查硬件故障,或重新安装`useradd`及其依赖库。通过`strace`跟踪命令执行过程,检查SELinux/AppArmor安全策略影响,并分析核心转储文件以进一步诊断问题根源。
825 1
|
NoSQL Linux
在Linux中调试段错误(core dumped)
在Linux中调试段错误(core dumped)在作比赛的时候经常遇到段错误, 但是一般都采用的是printf打印信息这种笨方法,而且定位bug比较慢,今天尝试利用gdb工具调试段错误.段错误(core dumped)一般都是数组索引位置不对,或者是数组越界等问题造成,在Linux环境下编程应该很容易就会遇到.
3096 0
|
NoSQL Linux
Linux下调试段错误(Segment fault)方法
1.查看当前linux是否打开core,方法是执行命令ulimit -a一般会出现如下的结果core file size        (blocks, -c) 00表示当前core被关闭 2.
1079 0
|
2月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
364 1
二、Linux文本处理与文件操作核心命令
|
2月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
274 137