专栏首页MyPanda的学习笔记编译、链接到载入、运行的大致过程----4.运行

编译、链接到载入、运行的大致过程----4.运行

根据前面所述,可执行文件的type=LOAD的segment才会被装载,但是并不会把所有的data和code都加载到内存,因为这样浪费空间也没有必要;装载的时候是按照page(默认为4KB,也就是0x1000)对齐的方式进行加载,加载之后,程序运行时所访问的地址仍然是虚拟地址,这个虚拟地址就是前文所述的“内存虚拟地址”,而 加载之后的数据毕竟是存在于“物理内存”中的,所以这个“内存虚拟地址”和“物理内存地址”之间需要有一个转换,而这个转换工作是“MMU”物理部件来完成的;MMU物理部件管理“内存虚拟地址”到“物理内存地址”的映射;

程序运行到某个代码段或者访问数据的时候,如果在内存中找不到数据,那么就会产生一种叫做page fault的异常,然后进入异常处理程序,而这个异常处理的过程所作的事情是: 把数据从物理磁盘或者swap空间 调入到内存,并做好“虚拟内存地址” 到“物理内存地址”的mapping. 处理完异常之后,程序会回到原来的断点继续运行;

如果程序在运行的过程中发生了内存访问错误,通常会触发core dump, 如果系统开启了core dump, 那么会导出当时的系统内存映像到一个core dump的文件里面,然后可以用gdb 工具对这个core dump 文件进行调式,从而尽可能获得当时的内存状况,分析发生crash的原因,core dump 中使用的地址依然是”内存虚拟地址“, 所以 在程序运行的过程中,我们完全可以不考虑”内存物理地址“,因为”内存虚拟地址“ 到”内存物理地址“的mapping 对程序员来说是透明的,即便是进行debug,也无需关心”内存物理地址“。

下面简要说明core dump 如何开启以及配置:

  1. "ulimit -c SIZE" 用于指定core file的大小(默认单位为KB),如果触发core dump时候的大小 超过指定的SIZE, 那么也不会进行core dump. 这个值默认为0, 表示不进行core dump, 最大可以设置为 unlimited . 建议设置为 memory的大小;ulimit 命令设置的大小在重起后就失效了,所以最好写入 /etc/profile 之类的文件;
  2. 设置core dump发生时候对应的文件路径以及名称,比如: echo "/root/core.%P" >/proc/sys/kernel/core_pattern 表示生成的路径在/root/ 下, 文件名为:core.%P , 其中扩展参数可以用来限定dump文件的名称,具体如下:
%p - insert pid into filename
%u - insert current uid into filename
%g - insert current gid into filename
%s - insert signal that caused the coredump into the filename
%t - insert UNIX time that the coredump occurred into filename
%h - insert hostname where the coredump happened into filename
%e - insert coredumping executable name into filename

默认的路径为: /var/logs, 而因为默认的/var/logs 并不是系统自带的路径,所以必须手动创建该目录,否则 core dump 触发的时候也不会生成相应的文件.

  1. 配置完成,要检验是否可以成功生成coredump 文件,可以通过发送信号的方式来测试:
[root@www kernel]# bash           #产生一个新的session
[root@www kernel]# ulimit -c unlimited       
[root@www kernel]# echo "/root/core_%p_%s_%e.%h.%t" >./core_pattern
[root@www kernel]# kill -s SIGSEGV $$         #发送信号,让其触发core dump. 
Segmentation fault (core dumped)
[root@www kernel]# ls -l /root | grep core              #生成的core dump 文件
-r--------+ 1 root root 1417216 Mar  8 17:06 core_3427_11_bash.www.my.com.1583658365
[root@www kernel]# 

上面例子,表示成功生成了core dump 文件,core dump的配置成功完成;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 初学web自动化测试--笔记1

    web driver 是可以直接操作浏览器的driver, 根据不同的浏览器,需要不同的driver,下面列出了一些可用的web driver的镜像地址: c...

    qsjs
  • 数字证书系列--用证书搭建https网站

    在前面一节介绍了如何创建CA, 以及如何用CA对CSR 证书请求文件进行签名,从而生成签名的服务器端证书。生成签名证书不是我们的最终目的,利用生成的签名证书来加...

    qsjs
  • Linux中find命令的点滴积累

    find 命令在Linux中的作用非常强大,对于初学者来说,可能有很多的参数并不能很熟练的使用,导致无法充分发挥find的强大作用;本文对部分参数做初步的探索:

    qsjs
  • CMake 进行调试

    在 Linux 下开发,可以用 gdb 进行调试,但是如果工程是用 CMake 构建的,那么需要在 CMakeLists.txt 中加入如下代码:

    Frank909
  • Qt5.12 + OpenGL 创建第一个多边形Core版

    https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/

    用户5908113
  • linux core文件机制

    在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所...

    一见
  • Linux下使用gdb调试core文件

    当程序运行过程中出现Segmentation fault (core dumped)错误时,程序停止运行,并产生core文件。core文件是程序运行状态的内存映...

    Dabelv
  • linux 下 core 相关知识总结

    在以往的测试过程中,每当遇到程序出现coredump的状况,我的第一反应就是有bug,让开发定位原因,但是如果自己能够去挖掘原因,在与开发沟通的过程中能明确指出...

    易惠芳
  • linux下core file size设置笔记

    现象说明:突然发现一台测试机器的java程序莫名其妙地没了,但是没有core dump!这就需要打开服务器的core文件生成的功能了,(即core dump文件...

    洗尽了浮华
  • 如何快速定位找出SEGV内存错误的程序Bug

    通过查看php日志/usr/local/php/var/log/php-fpm.log,有如下警告信息:

    sunsky

扫码关注云+社区

领取腾讯云代金券