在linux上,程序运行崩溃,通过dmesg,我们经常可以看到如下的崩溃信息。

[30573389.794159] a.out[8535]: segfault at 0 ip 00007f038f8e15b6 sp 00007ffcab34e670 error 4 in libread.so[7f038f8e1000+1000]

那么通过该信息,怎样定位到崩溃位置的函数和行号呢?

信息简述

  • at 0 变量内容
  • ip 00007f038f8e15b6 指令地址
  • sp 00007ffcab34e670 栈顶地址
  • error 4 错误类型
  • libread.so 崩溃的库
  • [7f038f8e1000+1000] 7f038f8e1000是库在内存映射中的 基地址,+1000不知道是啥

错误类型 的定义如下

 * Page fault error code bits:**   bit 0 == 0: no page found1: protection fault*   bit 1 == 0: read access1: write access*   bit 2 == 0: kernel-mode access1: user-mode access*   bit 3 == 1: use of reserved bit detected*   bit 4 == 1: fault was an instruction fetch

实例

read.c (动态库cpp文件)

int get_num_by_ptr(int *ptr)
{return *ptr;
}void set_num_by_ptr(int *ptr, int num)
{num = *ptr;
}

main.c (主文件)

extern int get_num_by_ptr(int *ptr);
int main(void)
{int num = get_num_by_ptr(0); //空指针解引用return 0;
}
  • 编译运行
gcc read.c -g -fPIC -shared  -o libread.so //没有-g,看不到行号,只能看到函数名
gcc main.c -L. -lread
./a.out
Segmentation fault (core dumped)
dmesg | tail -n1
[30573389.794159] a.out[8535]: segfault at 0 ip 00007f038f8e15b6 sp 00007ffcab34e670 error 4 in libread.so[7f038f8e1000+1000]
  • 分析

由崩溃信息得到,崩溃时的指令地址为0x7f038f8e15b6,libread.so在内存映射中的基地址为0x7f038f8e1000,那么崩溃地址在libread.so中的相对偏移地址为5b6 = 7f038f8e15b6 - 7f038f8e1000。
用addr2line调试可得(addr2line需要的是偏移地址)

addr2line -f -C -e libread.so 5b6
get_num_by_ptr
/root/seg/read.c:3
  • 总结

段错误,简单来说就是内存访问错误。大致分为这几类:

  • 访问不存在或未分配的内存地址。

nullptr就属于不存在的内存地址,被释放的内存或未分配的内存就属于未分配的内存地址。

  • 访问没有权限的内存地址。

如访问内核空间地址,对只读内存地址进行写操作(改变const修饰的变量)。

segfault信息分析相关推荐

  1. R语言使用pwr包的pwr.r.test函数对相关信息分析进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、效用值的情况下计算需要的样本量

    R语言使用pwr包的pwr.r.test函数对相关信息分析(Correlations)进行效用分析(power analysis).在已知效应量(effect size).显著性水平(sig).效用值 ...

  2. R语言使用pwr包的pwr.r.test函数对相关信息分析(Correlations)进行效用分析(power analysis)的语法

    R语言使用pwr包的pwr.r.test函数对相关信息分析(Correlations)进行效用分析(power analysis)的语法 目录

  3. 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )

    文章目录 一.Android 逆向方法 1.静态逆向解析 2.函数调用分析 3.动态运行跟踪 4.运行日志分析 5.文件格式解析 6.敏感信息分析 7.网络信息监控 8.软件动态调试 9.环境伪装模拟 ...

  4. 【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task

    文章目录 一.打印 Android 中当前运行的 Activity 任务栈信息 二.Activity 任务栈信息分析 三.Activity 在相同 Stack 的不同 Task 情况 一.打印 And ...

  5. python找房源_Python租房信息分析!找到最适合自己的房源信息!

    原标题:Python租房信息分析!找到最适合自己的房源信息! 租房信息分析 import numpy as np import pandas as pd import matplotlib.pyplo ...

  6. redis集群信息分析-cluster info-cluster nodes

    [README] 本文po出 redis集群的节点信息,槽信息,以及字段含义 [1]集群信息 192.168.163.203:6380> cluster info cluster_state:o ...

  7. 2018--20179215--《文献管理与信息分析》第三讲 英文数据库资源的发展趋势和利用...

    <文献管理与信息分析>第三讲 英文数据库资源的发展趋势和利用 一.科研相关的文献资源有以下十大来源: 专利.会议论文.期刊.学位论文.科技报告.科技档案.产品资料.政府出版物.标准文献.图 ...

  8. VideoUrlParser视频信息分析

    VideoUrlParser视频信息分析 概述 VideoUrlParser是一款基于PHP根据视频URL抓取视频信息的工具,支持优酷.土豆.酷六.56.乐视.搜狐.腾讯.新浪. 版本 v1.2 更新 ...

  9. 速读《文献管理与信息分析》笔记

    由于是第一次接触此类的书籍,加上研一的时间比较紧,并没有多少时间进行有效的阅读,只能对此进行简单的介绍,希望自己在未来的时间里可以仔细阅读和慢慢品味这本书. 这本书分为七章的学习计划,分别是: 第一章 ...

最新文章

  1. desc 枚举类型id_枚举系列(四):实现接口的枚举类
  2. mysql5.7命中率_MySQL5.7中 performance和sys schema中的监控参数解释(推荐)
  3. 每日算法系列【LeetCode 503】下一个更大元素 II
  4. 媒体化战略:数字时代企业如何做好公关与内容营销
  5. OpenCV用C画线代码示例
  6. 雷达导论PART-III.8 雷达接收机与数字化
  7. 责任链模式的高级用法
  8. Windows10关闭自动更新的多种方式
  9. display的值和作用
  10. 天猫店铺推广怎么收费?还有哪些推广方法?
  11. python 浏览器 弹 另存为_另存为弹出框如何调用
  12. 解决二义性问题解决 java_C++中常见的两种二义性问题及其解决方式
  13. D - Denouncing Mafia DFS
  14. GRU门控循环单元读书笔记
  15. Java的Enum枚举反编译的结果(为什么它是一个枚举对象是一个单例)
  16. java实现.费诺编码_香农费诺编码的matlab实现.doc
  17. 974. 和可被 K 整除的子数组
  18. workbench mesh划分边界层网格
  19. 国产芯片mcu性价比超高
  20. 爱普生Epson XP-830 一体机驱动

热门文章

  1. python numpy报错:VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences
  2. 解决中文乱码的文章,抄的
  3. seaborn boxplot 箱线图
  4. 中山纪念中学套题(1)
  5. 苹果13能用什么充电宝?苹果13充电宝推荐品牌
  6. Excel表格中如何合并同样名称的行数据
  7. 《野兽绅士》总结1——整理下领结,蜕变就从推开这扇门开始
  8. Word批量删除所有书签
  9. 【uniapp】JS中拼接字符串的写法
  10. 迅如疾风 PHPWind 6.3.2 测试手记