本文参考 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. Zookeeper一致性协议——ZAB

    ZAB协议简介 Zookeeper通过ZAB保证分布式事务的最终一致性. ZAB全称Zookeeper Atomic Broadcast(ZAB,Zookeeper原子消息广播协议) ZAB是一种专门 ...

  2. CentOS Linux SVN服务器 配置用户目录访问 权限 Authorization failed

    SVN 修改 aurhz 文件设置用户目录访问权限格式: [/code] user=rw user 用户对code目录拥有读和写的权限. 但是访问 svn://192.168.1.59 的时候却提示A ...

  3. Redis集群搭建采坑总结

    背景 先澄清一下,整个过程问题都不是我解决的,我在里面就是起了个打酱油的角色.因为实际上我负责这个项目,整个过程也比较清楚.之前也跟具体负责的同事说过,等过段时间带他做做项目复盘.结果一直忙,之前做的 ...

  4. 使用sqlmap

    实验环境要求: 1.安装win7或win10的笔记本或PC电脑一台,硬盘100GB,内存8GB 2.安装VMware Workstation 14以上 总体目标:基于centos7搭建dvwa web ...

  5. 基于http的netty demo

    1.引入netty的pom <dependency> <groupId>io.netty</groupId> <artifactId>netty-all ...

  6. SpringBoot官网提供所有组件整理

    下面所有SpringBoot组件整理来自于:https://start.spring.io/,紧随Spring社区的步伐...... Developer Tools Spring Boot DevTo ...

  7. java实现发送短信验证码

    java实现短信验证码发送 由于我们使用第三方平台进行验证码的发送,所以首先,我们要在一个平台进行注册. 在这里我选择是秒嘀科技,因为新人注册会赠送十元,足够测试使用了. 注册完成后,我们需要获取自己 ...

  8. postgresql-从表中随机获取一条记录

    目录 postgresql如何从表中高效的随机获取一条记录 随机获取一条记录random() 改写1 改写2 改写3 对比 注意 结语 postgresql如何从表中高效的随机获取一条记录 selec ...

  9. 上班从换一张桌面壁纸开始——开源小工具Bing每日壁纸

    发布一个自用的开源小软件,Bing每日壁纸,使用c# winform开发.该小软件可以自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事. 功能特性 自动获取Bing最新图片 ...

  10. Docker学习笔记之创建Ubuntu基础镜像

    在创建基础镜像之前需要安装Bootstrap工具debootstrap,所以执行命令: sudo apt install debootstrap 软件安装完成后就可以使用debootstrap工具下载 ...