本文参考 http://stackoverflow.com/questions/2179403/how-do-you-read-a-segfault-kernel-log-message和http://www.slideshare.net/noobyahoo/introduction-to-segmentation-fault-handling-5563036

linux中 遇到 段错误的情况, 多数人会想到core dump, 但是不一定有,其实有其他的办法, 当进程出现这类问题的时候, 使用dmesg查看,会看到类似下面的信息(那stackoverflow中的例子来说)

kernel: myapp[15514]: segfault at 794ef0 ip 080513b sp 794ef0 error 6 in myapp[8048000+24000]

这样的报错, 或者有的时候 看见的是 xxx.so中出现错误, 如果看到glibc中的错误,不要怀疑是glibc的错误,因为我们的代码的错误可能在glibc中表现出来, 比如调用glibc中的函数,但是传的地址是非法地址就会出现这种情况。

方法很简单, 使用addr2line或者objdump, ip是对应的代码的地址, at是segfault的内存地址,多数情况不用,如果此处是0或者-1, 可以帮助查找原因,比如你的指针地址是NULL或者 (void *)-1, 多数情况根据ip足够了, error是错误原因, 暂不分析。

1 死在目标程序中

objdump -DCglS myappo >> /tmp/debug_message

然后vim /tmp/debug_message, 查找ip对应的地址080513b,

可能找到多个, 有的可能是debug等信息,没有仔细研究, 你可以很容易看到,在代码中的对应的文件和行数, 如果想看到代码,可能需要代码路径正确才行, ok, 这样你已经拿到了代码中出错的位置,基本简单的检查就可以找到错误的原因了。

2 死在xxx.so中, 报错中会有 xxx.so[AAA+BBB], AAA是加载地址, ip和AAA做减法得到的16进制数就是偏移了, 和上面做法一样, ok

3 死在glibc中, 这个可能比较麻烦,因为即使你找到了对应的函数,但是代码中调用的地方太多了,不容易定位,暂时还搞不定。

4 使用addr2line      addr2line -f -e myapp 080513b

5 如果二进制文件是strip之后的, 此法失灵,可以把对应版本的代码重新编译,保留必要的信息,然后利用新生成的文件中查找地址。

6 对于内核代码也可以使用类似的方法,只要找到对应的ip的地址,拿到没有strip的二进制文件就ok。

 

C段错误等调试的更多相关文章

  1. Linux环境下段错误的产生原因及调试方法小结(转)

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

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

    转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...

  3. Linux的段错误调试方法

    linux段错误的调试方法 相关博文: http://blog.csdn.net/htianlong/article/details/7439030 http://www.cnblogs.com/pa ...

  4. 【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结

    本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 1. 段错误是什么 ...

  5. Linux环境下段错误的产生原因及调试方法小结【转】

    转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...

  6. Linux段错误及GDB Coredump调试方法

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

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

    源地址:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 补充:http://baike.baidu.com/link ...

  8. ubuntu segmentation fault 段错误

    1.段错误 http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 2.段错误的调试方法 2.1使用printf输出信息 2 ...

  9. Linux下的段错误(Segmentation fault)

    Linux开发中常见段错误问题原因分析 1 使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针.不存在的地址.受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用G ...

随机推荐

  1. 01. Consul 入门

    简介 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册 ...

  2. AWS中国区的那些“坑”

    前言 最近做的一个项目是要把公司在国外已经上线的一个物联网的项目移植到AWS中国区来. 由于AWS属于国外云产商,在中国运营,必须符合国家的相关规定: 必须是合资公司 (AWS北京区由北京光环新网运营 ...

  3. [leetcode]66Plus One

    /** * Given a non-negative integer represented as a non-empty array of digits, plus one to the integ ...

  4. Java 为每个原始类型提供了哪些包装类型:

    java的包装类型: 原始类型: boolean,char,byte,short,int,long,float,double 包装类型:Boolean,Character,Byte,Short,Int ...

  5. editmd输出到前端显示

    官方案例:html-preview-markdown-to-html.html 输出后台数据显示在前端,格式化内容<!DOCTYPE html> <html lang="z ...

  6. JS验证三种提示框

    1 <form> 2 <!-- 按钮选择点击 --> 3 <tr> 4 <td><input type="button" na ...

  7. Java学习日报7.23

    import java.util.Scanner;public class LandP {public static void main(String args[]) { System.out.pri ...

  8. 每日一个linux命令4

    mkdir命令 linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. mkdir test    创建一个空目录 ...

  9. Beta冲刺——第七天

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...

  10. B树与B+树区别辨析

    我们都知道,innodb中的索引结构使用的是B+树.B+树是一种B树的变形树,而B树又是来源于平衡二叉树.相较于平衡二叉树,B树更适合磁盘场景下文件索引系统.那为什么B树更适合磁盘场景,B+树又在B树 ...