01-Coredump核心转存&&Linux程序地址分析
2017-04-12 21:40
344 查看
一Core Dump核心转存
二Linux程序地址分析
Linux应用程序运行出现错误,有时候并不会马上就体现出来。-_-可能是由于错误的条件还没触发把。
但是发生的错误应该在哪里查找呢?—这时候,我们的Core Dump就派上用场了。
Core Dump又叫核心转存。当程序在运行过程中发生异常, 这时Linux系统可以把程序出错时的内存内容存储在一个core文件中, 这种过程叫Core Dump。
产生的原因:
Linux应用程序在运行过程中,经常会遇到Segment fault(段错误) 这样的错误。产生这样错误的原因通常有:
数组访问越界
访问空指针
栈溢出
修改只读内存
开启和关闭:
打开:ulimit -c ulimited
关闭:ulimit -c 0
查看:ulimit -c
分析命令:
示例:
1、Linux的执行程序格式都是elf的;可以使用命令readelf -S 可执行程序查看程序的地址分布情况;
2、命令file可以查看文件的格式;
二Linux程序地址分析
Linux应用程序运行出现错误,有时候并不会马上就体现出来。-_-可能是由于错误的条件还没触发把。
但是发生的错误应该在哪里查找呢?—这时候,我们的Core Dump就派上用场了。
一、Core Dump——核心转存
定义:Core Dump又叫核心转存。当程序在运行过程中发生异常, 这时Linux系统可以把程序出错时的内存内容存储在一个core文件中, 这种过程叫Core Dump。
产生的原因:
Linux应用程序在运行过程中,经常会遇到Segment fault(段错误) 这样的错误。产生这样错误的原因通常有:
数组访问越界
访问空指针
栈溢出
修改只读内存
开启和关闭:
打开:ulimit -c ulimited
关闭:ulimit -c 0
查看:ulimit -c
分析命令:
用法 | gdb 程序名 core文件名 |
功能 | 发生core dump之后, 可以使用gdb进行查看core文件的内容, 以定位程序出错的位置 |
例 | gdb ./test core.12345 |
功能 | 这个程序在函数中访问了空指针导致异常的发生,查看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 ; }
二、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、每个程序在内存中都占用同一块代码区和数据区; |
2、命令file可以查看文件的格式;
include <stdio.h> int main ( int argc , char **argv ) { int a ; scanf("please don't enter number :%d\n",&a) ; return 0 ; }
相关文章推荐
- 01-Coredump核心转存&&Linux程序地址分析【转】
- 【ARM&Linux】core dump程序故障分析调试
- 基于visual c++之windows核心编程代码分析(44)监测任意程序函数起始地址
- Linux中程序的栈帧分析以及修改函数地址
- 基于visual c++之windows核心编程代码分析(44)监测任意程序函数起始地址
- Linux中程序的栈帧分析以及修改函数地址
- gprof && oprofile 分析linux程序性能瓶颈
- 【ARM&Linux】Linux系统C程序中变量的存放地址布局
- linux 反汇编分析变量地址并用gdb修改运行中的程序内存变量实验
- 基于visual c++之windows核心编程代码分析(44)监测任意程序函数起始地址
- Linux上coredump调试:call stack栈顶函数地址为0 分析实战
- [转载] linux启动流程分析(2)---内核启动地址的确定
- linux&Windows动态链接库技术实现和设计程序常用的技术
- AT&T汇编---第一个linux汇编程序
- 使用Gnu gprof进行Linux平台下的程序分析
- Linux-Netfilter&iptables实现机制的分析及应用
- [转载] linux启动分析(5)---C程序入口函数start_kernel
- 应知应会:在linux/unix上分析程序日志的技巧
- linux内和分析之sched.c程序
- 《编程之美》之:"程序理解和时间分析"与JOJ 2042