01-Coredump核心转存&&Linux程序地址分析【转】

转自:http://www.itwendao.com/article/detail/404132.html

 

  • Linux应用程序运行出现错误,有时候并不会马上就体现出来。-_-可能是由于错误的条件还没触发把。
  • 但是发生的错误应该在哪里查找呢?—这时候,我们的Core Dump就派上用场了。

一、Core Dump——核心转存

    1. 定义
      • Core Dump又叫核心转存。当程序在运行过程中发生异常, 这时Linux系统可以把程序出错时的内存内容存储在一个core文件中, 这种过程叫Core Dump。
    2. 产生的原因
      • Linux应用程序在运行过程中,经常会遇到Segment fault(段错误) 这样的错误。产生这样错误的原因通常有:
        1. 数组访问越界
        2. 访问空指针
        3. 栈溢出
        4. 修改只读内存
    3. 开启和关闭
      1. 打开:ulimit -c ulimited
      2. 关闭:ulimit -c 0
      3. 查看:ulimit -c
    4. 分析命令
      用法 gdb 程序名 core文件名
      功能 发生core dump之后, 可以使用gdb进行查看core文件的内容, 以定位程序出错的位置
      gdb ./test core.12345
    5. 示例
      功能 这个程序在函数中访问了空指针导致异常的发生,查看core dump文件的具体过程
      步骤

      1、开启core dump功能;(ulimit -c ulimited)

      2、编写程序test.c文件,生成可执行文件test;(gcc -g test.c -o test)

      3、查看core dump文件,找出错误;(gdb ./test core.12345)

#include <stdio.h>
int main( int argc , char **argv ) { 
    char *p ;
    *p = 250 ;
    return 0 ;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里就是上面程序出现的错误信息

二、Linux程序地址分析


  • 程序构成

    在Linux应用程序中,函数代码中的变量、方法等都有其存储空间,下面就介绍下这几个存储空间:

    数据存放 内存布局

    当Linux应用程序在内存中运行的时候,以上组成部分在内存中又是如何布局的呢?

    代码段: 代码,全局常量(const)、字符串常量;

    1.从低地址到高地址分别为:代码段、数据段、BSS段、堆、栈;

    2.堆向高内存地址生长;

    3.栈向低内存地址生长;

    这里写图片描述
    数据段: 全局变量(初始化以及未初始化的)、静态变量(全局的和局部的、初始化的以及未初始化的);
    BSS段(Block Started by Symbol,

    又名:未初始化数据段):

    这里其实是数据段中的一个子分区而已;
    堆(heap): 动态分配的区域;
    栈(stack): 局部变量(初始化以及未初始化的,但不包含静态变量)、局部只读变量(const);
    编写程序查看数据的内存地址分布:

    1、编写程序chen.c(代码如下);

    2、生成可执行程序chen(gcc -g chen.c -o chen);

    3、执行程序;

    4、开启另外一个终端,使用命令(ps aux)查看程序的执行pid123;

    5、cat /proc/pid123/maps/即可看到程序占用的内存地址;

    注意:

    1、每个程序的内存起始地址都是0x8048000;

    2、每个程序在内存中都占用同一块代码区和数据区;

1、Linux的执行程序格式都是elf的;可以使用命令readelf -S 可执行程序查看程序的地址分布情况;
2、命令file可以查看文件的格式;

include <stdio.h>
int main ( int argc , char **argv ) {
    int a ;
    scanf("please don't enter number :%d\n",&a) ;
    return 0 ;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
posted @   Sky&Zhang  阅读(920)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示