本文参考 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. 手写简易版RPC框架基于Socket

    什么是RPC框架? RPC就是远程调用过程,实现各个服务间的通信,像调用本地服务一样. RPC有什么优点? - 提高服务的拓展性,解耦.- 开发人员可以针对模块开发,互不影响.- 提升系统的可维护性及 ...

  2. [leetcode]罗马数字和阿拉伯数字相互转换

    罗马转阿拉伯 public int romanToInt(String s) { /* 从左到右依次根据哈希表进行加法 如果是"CM"900这种情况就要执行+M和-C处理 */ i ...

  3. 盘点 Java 开发 2020 年发生的几件大事,你必须得知道!

    2021 年了,在过去的一年 Java 软件开发行业都发生了哪些重大事件呢? 这篇栈长带大家回顾一下,其实在元旦的<滚蛋吧,2020>也略有介绍,这篇就更加详细的总结一下. 1.Java ...

  4. Android——几种数据存储应用浅谈

    (1)android中的数据存储主要有五种方式: 第一种.sharedPreferences存储数据, 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型.基本类型的值.比如应用程序的各种配 ...

  5. k8s之HTTP请求负载分发

    一.导读 对于基于HTTP的服务来说,不同的URL地址经常对应不同的后端服务或者虚拟服务器,通常的做法是在应用前添加一个反向代理服务器Nginx,进行请求的负载转发,在Spring Cloud这个微服 ...

  6. 关于ajax 异步文件上传 node 文件后台接口

    <body> <img src="" alt="" id="img"> <input type="f ...

  7. 【Java基础】反射

    反射 反射的概述 反射(Reflection)是被视为动态语言的关键,反射机制允许程序在执行期借助 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性和方法. 加载完类 ...

  8. 【Docker】CentOS7 上无网络情况下安装

    自建虚拟机,但是连接不上网络,只能通过下载rpm包进行安装docker 环境:CentOS 7.3.1611 x64 rpm镜像下载地址用的阿里的https://mirrors.aliyun.com/ ...

  9. three.js cannon.js物理引擎之约束

    今天郭先生继续说cannon.js,主演内容就是点对点约束和2D坐标转3D坐标.仍然以一个案例为例,场景由一个地面.若干网格组成的约束体和一些拥有初速度的球体组成,如下图.线案例请点击博客原文. 下面 ...

  10. 记录一下 ThreadLocal 与 WeakReference

    ThreadLocal & WeakReference Thread整体的模块图 Thread -> ThreadLocalMap 对于继承了 WeakReference Entry本身 ...