关于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语言编程时,遇到一个错误,网上说的都很复杂,看都看不懂,其实就是你对指针进行直接操作之前,没有对它进行分配地址空间。 所以在运行的时候,它不知道在那里操作(比如赋值,取值),所以才报了这个错误。
42525 0
|
NoSQL Linux
在Linux中调试段错误(core dumped)
在Linux中调试段错误(core dumped)在作比赛的时候经常遇到段错误, 但是一般都采用的是printf打印信息这种笨方法,而且定位bug比较慢,今天尝试利用gdb工具调试段错误.段错误(core dumped)一般都是数组索引位置不对,或者是数组越界等问题造成,在Linux环境下编程应该很容易就会遇到.
2838 0
|
NoSQL Linux
Linux下调试段错误(Segment fault)方法
1.查看当前linux是否打开core,方法是执行命令ulimit -a一般会出现如下的结果core file size        (blocks, -c) 00表示当前core被关闭 2.
934 0
|
NoSQL Linux C语言
Linux下的段错误产生的原因及调试方法
Linux下的段错误产生的原因及调试方法     简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.
900 0
|
NoSQL Linux C语言
Linux下调试段错误的方法[Segmentation Fault]--GDB
<p><span style="font-family:Verdana,Arial,Helvetica,sans-serif"><span style="font-size:14px; line-height:25px"><a target="_blank" href="http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857
4807 1
|
6天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
|
2天前
|
监控 Linux Windows
50个必知的Linux命令技巧,你都掌握了吗?(下)
50个必知的Linux命令技巧,你都掌握了吗?(下)