本文参考 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. java中远程调用接口springboot

    package com.kakarote.crm.utils; import cn.hutool.core.util.ObjectUtil; import org.apache.http.client ...

  2. [Deep Learning] 神经网络编程基础 (Basics of Neural Network Programming) - 逻辑回归-梯度下降-计算图

    在神经网络中,假如有m个训练集,我们想把他们加入训练,第一个想到得就是用一个for循环来遍历训练集,从而开始训练.但是在神经网络中,我们换一个计算方法,这就是 前向传播和反向传播. 对于逻辑回归,就是 ...

  3. Linux嵌入式学习-ds18b20驱动

    ds18b20的时序图如下: 复位时序: 读写时序: 以下是程序代码: #include <linux/module.h> #include <linux/init.h> #i ...

  4. ESP8266-01烧录神器,ESP8266-01S烧录程序 ESP-01烧录固件

    如下图所示:"USB转ESP8266",在某宝上可以买到,但是建议买两个! 为什么要买两个呢?一个用于测试AT指令.接电呀什么的.另外一个通过焊接就可以改造成烧录器了. 引脚说明: ...

  5. 为了搞清楚类加载,竟然手撸JVM!

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...

  6. JVM的艺术-对象创建与内存分配机制深度剖析

    JVM的艺术-对象创建与内存分配机制深度剖析 引言 本章将介绍jvm的对象创建与内存分配.彻底带你了解jvm的创建过程以及内存分配的原理和区域,以及包含的内容. 对象的创建 类加载的过程 固定的类加载 ...

  7. STM32串口中断的一些资料

    在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在这里.以供自己查阅,以及方便其他人. TC ====TXE 顺便预告下最近会写个有关串口处理数据的帖子,从查询和中断方面以及数据处理 ...

  8. 30天自制OS(linux环境)-day1

    30天自制OS(linux环境)--第一天 我是在CentOS的环境上面实现的,使用ubuntu的环境也是类似的 第一步:因为要对二进制文件进行编辑,所以安装二进制编辑器hexedit(当然其他的也可 ...

  9. Redis-基础和应用篇

    2020,到新公司这一年多以来,更新文章和总结知识的习惯被丢掉了.我复盘了下自己,原因不是公司技术氛围不好,也不是每天业务需求太多,其根本原因还是---惰性.作为我们技术人随着年龄的增长,精力也会被生 ...

  10. SQL Server 数据库还原进度查看

    SQL Server 数据库还原进度查看 关键字:数据库,还原,进度,查看 文档说明: 本文档受某实际需求启发,某约500G大小数据库还原,由于对应服务器性能较差(内存仅4G且可用内存仅2.8G),数 ...