
正文
01-Coredump核心转存&&Linux程序地址分析【转】
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
转自:http://www.itwendao.com/article/detail/404132.html
目录(?)[-]
- 一Core Dump核心转存
- 二Linux程序地址分析
-
- 一Core Dump核心转存
- 二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 ;
}
-
1
-
2
-
3
-
4
-
5
-
6
-
定义
:
- Core Dump又叫核心转存。当程序在运行过程中发生异常, 这时Linux系统可以把程序出错时的内存内容存储在一个core文件中, 这种过程叫Core Dump。
-
产生的原因
:
-
Linux应用程序在运行过程中,经常会遇到Segment fault(段错误) 这样的错误。产生这样错误的原因通常有:
- 数组访问越界
- 访问空指针
- 栈溢出
- 修改只读内存
-
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、每个程序在内存中都占用同一块代码区和数据区;
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
|
程序构成
在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 ;
}
01-Coredump核心转存&&Linux程序地址分析【转】的更多相关文章
-
linux应用程序地址布局,王明学learn
linux应用程序地址布局 在学习Linux应用程序开发时,经常会遇到如下概念:代码段.数据段.BSS段(Block Started by Symbol,又名:未初始化数据段).堆(heap)和栈(s ...
-
如何实现在Windows上运行Linux程序,附示例代码
微软在去年发布了Bash On Windows, 这项技术允许在Windows上运行Linux程序, 我相信已经有很多文章解释过Bash On Windows的原理, 而今天的这篇文章将会讲解如何自己 ...
-
编写出色的GNU/Linux程序
http://advancedlinuxprogramming.com提供了本书电子版的免费下载. 1 与执行环境交互 关于参数 C语言程序的main()函数使用两个参数和执行环境交互--(int)a ...
-
linux程序自启动和新建linux服务的方法
1 linux创建自启动程序 自启动的两种方法,都经过自己测试.1.1 自启动程序方法1: 在etc/rc.local在里面加入/home/robin/code/autoruntest & ...
-
应用 Valgrind 发现 Linux 程序的内存问题(转)
Valgrind 概述 体系结构 Valgrind 是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个 ...
-
Linux程序包管理rpm与yum
Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...
-
[转载]应用 Valgrind 发现 Linux 程序的内存问题
应用 Valgrind 发现 Linux 程序的内存问题 如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在.有一款非常优秀的 linux 下开源的内存问题检测工具:valg ...
-
操作系统-存储管理(5)IA-32/Linux的地址转换
IA-32/Linux按字节编址:在保护模式下,IA-32采用段页式虚拟存储管理方式,存储地址采用逻辑地址.线性地址和物理地址来进行描述. 逻辑地址由48位组成,包含16位段选择符(高13位为段表项的 ...
-
Linux程序包管理之yum及源代码安装
第十六章.Linux程序包管理之yum及源代码安装 目录 yum介绍 yum配置文件 yum的repo配置文件中可用的变量 yum命令的使用 使用光盘作为本地yum仓库 如何创建yum仓库 编译安装的 ...
随机推荐
-
Qt——线程与定时器
一.定时器QTimer类 The QTimer class provides repetitive and single-shot timers. The QTimer class provides ...
-
System Board Replacement Notice
System Board Replacement Notice System Board Replacement Notice for TP 770E and TP 600 Restoring the ...
-
easyui动态生成双列头
实习时老大交给任务,让我做这样一个效果,选择日期并点击查询时,动态生成列头,下一列要求对应日期的星期. 效果图: 下面贴出查询的单击函数: //查询按钮 function queryByDate(){ ...
-
debian8安装harbor
这里的系统版本是debian8.8,harbor版本为1.1.2. 1.安装docker-ce 1.1.Install packages to allow apt to use a repositor ...
-
DataTables实现rowspan思路
直接看例子吧 <table id="example" class="display table table-bordered" cellspacing=& ...
-
不同tab下的列表长度不同,tab的样式和底部的位置不同
要求:当点击不同的tab时,被点击的tab样式不同,产生不同的列表.当列表长度大于屏幕高度时,底部随列表显示:当列表长度小于屏幕高度时,底部固定在屏幕的底部. demo: <!DOCTYPE h ...
-
BZOJ-3509 母函数+分块+暴力+FFT
题目描述 给定一个长度为N的数组A[],求有多少对i, j, k(1<=i<j<k<=N)满足A[k]-A[j]=A[j]-A[i]. 输入格式 第一行一个整数N(N<= ...
-
windows10下R配置Rstdio,怎么处理
首先要确保电脑上只有一个R程序,然后官网下载Rstdio安装包. 配置:选择Rstdio配置界面的第三项,然后关联到R的安装文件夹下的BIN文件夹即可. 但是,直接打开Rstdio的话,界面会一片空白 ...
-
一个最简单的使用Entity Framework 查询SQL 数据库的例子
1.ADO.NET 3.5 Entity Framework是随着.net framework 3.5一起发布的,确认开发环境版本是大于等于3.5版本 2.确认已经安装了ADO.NET 3.5 Ent ...
-
tp5.1 insert 返回id, 不等于符号
$insertId = Db::name('user_address')->insertGetId($data); //add=>insert, insert 返回值不再是插入的id; i ...
linux应用程序地址布局 在学习Linux应用程序开发时,经常会遇到如下概念:代码段.数据段.BSS段(Block Started by Symbol,又名:未初始化数据段).堆(heap)和栈(s ...
微软在去年发布了Bash On Windows, 这项技术允许在Windows上运行Linux程序, 我相信已经有很多文章解释过Bash On Windows的原理, 而今天的这篇文章将会讲解如何自己 ...
http://advancedlinuxprogramming.com提供了本书电子版的免费下载. 1 与执行环境交互 关于参数 C语言程序的main()函数使用两个参数和执行环境交互--(int)a ...
1 linux创建自启动程序 自启动的两种方法,都经过自己测试.1.1 自启动程序方法1: 在etc/rc.local在里面加入/home/robin/code/autoruntest & ...
Valgrind 概述 体系结构 Valgrind 是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个 ...
Linux程序包管理 Linux中软件的安装主要有两种形式:一种是直接下载源代码包自行编译后安装,另一种直接获取rpm软件包进行安装. 程序的组成部分: 二进制程序:程序的主体文件,比如我们运行一个l ...
应用 Valgrind 发现 Linux 程序的内存问题 如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在.有一款非常优秀的 linux 下开源的内存问题检测工具:valg ...
IA-32/Linux按字节编址:在保护模式下,IA-32采用段页式虚拟存储管理方式,存储地址采用逻辑地址.线性地址和物理地址来进行描述. 逻辑地址由48位组成,包含16位段选择符(高13位为段表项的 ...
第十六章.Linux程序包管理之yum及源代码安装 目录 yum介绍 yum配置文件 yum的repo配置文件中可用的变量 yum命令的使用 使用光盘作为本地yum仓库 如何创建yum仓库 编译安装的 ...
-
Qt——线程与定时器
一.定时器QTimer类 The QTimer class provides repetitive and single-shot timers. The QTimer class provides ...
-
System Board Replacement Notice
System Board Replacement Notice System Board Replacement Notice for TP 770E and TP 600 Restoring the ...
-
easyui动态生成双列头
实习时老大交给任务,让我做这样一个效果,选择日期并点击查询时,动态生成列头,下一列要求对应日期的星期. 效果图: 下面贴出查询的单击函数: //查询按钮 function queryByDate(){ ...
-
debian8安装harbor
这里的系统版本是debian8.8,harbor版本为1.1.2. 1.安装docker-ce 1.1.Install packages to allow apt to use a repositor ...
-
DataTables实现rowspan思路
直接看例子吧 <table id="example" class="display table table-bordered" cellspacing=& ...
-
不同tab下的列表长度不同,tab的样式和底部的位置不同
要求:当点击不同的tab时,被点击的tab样式不同,产生不同的列表.当列表长度大于屏幕高度时,底部随列表显示:当列表长度小于屏幕高度时,底部固定在屏幕的底部. demo: <!DOCTYPE h ...
-
BZOJ-3509 母函数+分块+暴力+FFT
题目描述 给定一个长度为N的数组A[],求有多少对i, j, k(1<=i<j<k<=N)满足A[k]-A[j]=A[j]-A[i]. 输入格式 第一行一个整数N(N<= ...
-
windows10下R配置Rstdio,怎么处理
首先要确保电脑上只有一个R程序,然后官网下载Rstdio安装包. 配置:选择Rstdio配置界面的第三项,然后关联到R的安装文件夹下的BIN文件夹即可. 但是,直接打开Rstdio的话,界面会一片空白 ...
-
一个最简单的使用Entity Framework 查询SQL 数据库的例子
1.ADO.NET 3.5 Entity Framework是随着.net framework 3.5一起发布的,确认开发环境版本是大于等于3.5版本 2.确认已经安装了ADO.NET 3.5 Ent ...
-
tp5.1 insert 返回id, 不等于符号
$insertId = Db::name('user_address')->insertGetId($data); //add=>insert, insert 返回值不再是插入的id; i ...








