《软件调试的艺术》学习笔记——GDB使用技巧摘要(3)——程序崩溃处理

2023-11-18

  1. 程序为什么会崩溃
  2. 内存中的程序布局

当某个错误导致程序突然和异常地停止执行时,程序崩溃。迄今为止最为常见的导致程序崩溃的原因是试图在未经允许的情况下访问一个内存位置。硬件会感知这件事,并执行对操作系统的跳转。Unix系列的平台上,操作系统一般会宣布程序导致了段错误(seg
fault),并停止程序运行。在微软的windows系统上,对应的术语是一般保护错误(general protection
fault)。无论是哪个名称,硬件都必须支持虚拟内存,而且操作系统必须使用虚拟内存才会发生这个错误。虽然这是如今的通用计算机的标准,但是读者应记住,专用的小型计算机一般没有这种情况,比如用来控制机器的嵌入式计算机。

程序在内存中是如何分布的?

在Unix平台上,为程序分配的虚拟地址的布局通常如下:

.text

.data

.bss

未使用

env

这里虚拟地址0在最下方,箭头显示了其中两个组件(堆和栈)的增长方向,当它们增长时,消耗掉未使用的自由区域。各个部分的作用如下:

  • 文本区域(.text),由程序源代码中的编译器产生的机器指令组成。这一组件包括静态链接代码,包括做初始化工作然后调用main()的系统代码/usr/lib/crt0.o
  • .data 数据区域,包含在编译时分配的所有程序变量,即全局变量。如 int x = 5;
  • .bss 数据区域,包含的是存放未初始化数据的全局变量
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《软件调试的艺术》学习笔记——GDB使用技巧摘要(3)——程序崩溃处理 的相关文章

  • 最少输入命令行计算器 - tcsh 与 bash

    我喜欢有一个方便的命令行计算器 要求是 支持所有基本算术运算符 用于求幂 加上括号用于分组 需要最少的输入 我不想调用一个程序与之交互 然后要求它退出 理想情况下 除了表达式本身之外 命令行中只应输入一个字符和一个空格 它应该知道如何忽略逗
  • 在 Shell 中连接字符串

    我在连接字符串 Linux shell 脚本时遇到这个问题 apphome cd dirname 0 pwd cd gt dev null echo APP Home echo apphome libdir apphome lib echo
  • 将 ls 输出转换为 csv

    我将如何转换 find ls gt tmp files txt 这给了我类似的东西 908715 40 rwxrwxr x 1 david staff 16542 Nov 15 14 12 dump info py 908723 0 drw
  • 如何在 gdb 中附加进程

    我有一个简单的 C 程序 它分叉一个进程 然后运行一个可执行文件 我想将子进程附加到 gdb 我在控制台中运行主程序并打开另一个控制台来查找子进程的 pid 然后使用以下命令启动 gdb gdb attach 12271 where 122
  • 检测节点的系统路径上是否存在可执行文件

    Question 有没有一种简单的方法可以使用节点判断系统可执行文件在系统路径上是否可用 例如 如果用户安装了 python usr bin python and usr bin is in PATH我如何在 Node 中检测到这一点 相反
  • 如何删除 CSV 文件的一个或多个列,该文件的单元格值带有用双引号引起来的字符串

    如何从 CSV 文件中删除具有逗号分隔值且字符串用双引号括起来且中间有逗号的列 我有一个文件 44 csv 有 4 行 包括标题 格式如下 column1 column2 column3 column 4 column5 column6 1
  • 是否有任何正式的方法或已知的方法来规范化 xml 文件以生成差异?

    似乎有很多关于 WRT 工具在 xml 之间生成差异的问题 但还没有这个问题 所以任何知道这个问题的人都会向我展示一个链接或粘贴任何人已经解决了这个问题的示例 规范化 xml 文件意味着 重新排序属性的外观 重新排序标签的外观 可通过命令行
  • -s 和 -p 如何改变读取命令?

    我正在尝试解释这段代码 搜索谷歌看看这些命令的含义 但没有运气 我把我对每一行 块对我意味着什么的解释 如果我错了 请纠正我 我是 unix 命令新手 代码 bin bash input 1st command line argument
  • 你能帮助解释我的 svn diff 输出吗?

    我正在使用 SVN DIFF 比较两个文件夹 一个在分支中 一个在主干中 目的是确定更改列表 然后我对分支中的文件进行了一些更改 但输出显示我已经在主干中修改了它们 为什么会出现这种情况 有没有更好的命令来获取我正在寻找的结果 我现在使用的
  • C 控制台底部的输入栏

    窗底 一些应用程序 如 vim mutt aptitude 包含 用于输出的顶部窗口部分和 底部供用户输入或显示状态 假设有一个子进程用于输出 另一个子进程用于接受用户输入 目的是允许在您键入输入或查看状态的同时更新输出 Actions U
  • 当 readdir() 返回文件名时,stat() 错误“没有这样的文件或目录”

    我无法识别 stat 引发的错误 下面的程序读取目录中的所有文件并打印文件名 DIR dp struct dirent dirp struct stat sb if dp opendir argv 1 NULL perror can t o
  • 如何在 Bash shell 脚本中检查目录是否存在?

    什么命令检查 Bash shell 脚本中的目录是否存在 检查目录是否存在 if d DIRECTORY then echo DIRECTORY does exist fi 检查目录是否不存在 if d DIRECTORY then ech
  • 查找目录中最新的文件而不读取其所有内容

    我试图在一个巨大的文件系统中找出最新的文件 一种方法是浏览所有目录 一次一个 读取其内容 选择最新文件等 明显的缺点是我必须得到all特定目录中的文件 我想知道 Python 1 中是否有一个 Unix 支持的 神奇 调用来获取目录中的最新
  • 在远程机器上执行多个命令

    在下面的命令中 我尝试 ssh 命令并执行多个命令 如果任何命令失败 即如果 command1 退出 那么如果 command1 和 commnd 2 退出 否则在远程计算机上执行命令 3 我如何退出 我怎样才能做到这一点 ssh logi
  • 如何在屏障处正确同步线程

    我遇到一个问题 我很难判断应该使用哪个同步原语 我正在创建 n 个在内存区域上工作的并行线程 每个线程都分配给该区域的特定部分 并且可以独立于其他线程完成其任务 在某些时候 我需要收集所有线程的工作结果 这是使用屏障的一个很好的例子 这就是
  • 更改grep命令的分隔符

    我在用grep检测 a href xxxx something here a 当链接在输入中分成两行时 这不起作用 我想 grep 检查直到它检测到但现在它只是将输入输入到 grep 中 直到检测到新行为止 所以如果输入是这样的 a hre
  • 如何从纯文本中查找键值存储中的值

    给定一个纯文本文件 其中包含 FOO foo BAR bar BAZ baz 我们如何grep使用键获取值 Use a 向后看 https regex101 com r q3FNpe 1 grep Po lt FOO w file foo
  • 递归相对于 git rm -r [文件名] 意味着什么

    我正在学习一些 git 教程 但不明白运行之间的区别 git rm path to file and git rm r path to file 递归到底是什么意思 提前致谢 从 git rm 手册页 主目录名称 例如dir去除dir fi
  • fork 和现有线程?

    在linux系统上 子进程查看现有线程的方式与父进程相同吗 int main create thread 1 int child pid fork if 0 child pid else 由于子进程复制了整个地址空间 因此线程的状态会发生什
  • 同时安装多个自制公式

    您可以通过安装多个自制程序brew install package1 package2 但是 如果您有一个文本文件 其中包含您想要安装的所有软件包 你会怎么做 brew install lt packages txt不起作用 它给了我回应

随机推荐

  • 全屏Activity弹出键盘不顶起布局

    最近遇到的一个问题是全屏Activity中要求弹出键盘不顶起布局 首先windowSoftInputMode的取值是有多个的 在全屏场景下adjustPan是没有用的 需要使用adjustResize首先确保键盘不顶起布局 android
  • 黑苹果 MacOS 10.15 Catalina 安装详细教程带工具资料

    图文教程悦享地址 点击打开链接 视频教程 B站地址 点击打开链接 一 准备工作 一个8G以上的U盘 有的U盘标的是8G 实际只有X 实际容量小于7 5G的会失败 MacOS镜像 TransMac 刻录工具 DiskGenius 分区工具 E
  • 机器学习DGA域名检测

    恶意域名 恶意域名是指黑客在攻击过程中或者对目标网络实施控制时 使用dga算法生成的域名 这种域名通常硬编码在恶意软件中 我们在做流量分析时不仅要通过流量的指纹特征识别威胁 也可以通过检测是否解析了恶意域名来判断网络中是否存在肉鸡 传统DG
  • IDEA编译报错:java: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出

    IDEA编译Flink源码时报错 java 未报告的异常错误X 必须对其进行捕获或声明以便抛出 原因是环境变量配置的是JDK8 Flink部分代码是基于JDK11编写的 将JDK升级为JDK11 重新编译即成功
  • 推荐一款基于XNA的开源游戏引擎《Engine Nine》

    一 前沿导读 XNA是微软基于 Net部署的下一代3D 2D游戏开发框架 其实XNA严格来说类似下一代的DirectX 当然不是说XNA会取代DirectX 但是基于XNA我们对于面向XBOX360 WP等系列其他平台的移植成本非常的低 据
  • 从系统里面查看服务器端口,从系统里面查看服务器端口号

    从系统里面查看服务器端口号 内容精选 换一换 已成功登录Java性能分析 待安装分析辅助软件的服务器已开启sshd 已安装JDK并配置环境变量 打开 添加目标环境 窗口 如图1所示 参数说明如表1所示 添加目标环境添加目标环境参数说明参数说
  • shell脚本简介+编写

    1 常用Linux命令 2 Linux下脚本编写 3 windows下CMD常用命令 文章目录 一 变量 1 系统预定义变量 2 自定义变量 3 特殊变量 n n n
  • C++ 标准库函数 bind

    背景 可调用对象 对于一个对象或者一个表达式 如果可以对其使用调用运算符 则称为可调用对象 调用形式 一种调用形式对应了一个函数类型 指明了调用返回类型以及传递的参数类型 比如 int int int std bind 概念 可将 bind
  • 勇于尝试新鲜事物,利于项目来积累学习经验

    很多人都会根据企业的发展需求 再选择自己的开发方向 其实没必要完全根据企业的发展路线来决定的个人的职业路线 正如 黑客与画家 和 黑客帝国 所表达的 程序员应该将白天的工作作为一种职业相关性的经验积累 而将晚上的时间用于尝试新的技术和领域
  • matlab 学习算法,matlab深度学习算法合集

    实例简介 CAE CNN NN SAE等等matlab版深度学习算法合集 以及相关测试数据 拿到就能直接用 实例截图 核心代码 DeepLearnToolbox matlab DeepLearnToolbox CAE caeapplygra
  • java中空值怎么表示_JAVA中空值null与字符串null含义的区分

    java中字符串型的量 如 String s 初始化为空时 s null 打印出来为null 但是对他不能进行 isEmpty 和 length 的操作 会抛出空指针异常 给他们后边添加字符串后 s s yuanyuan 打印时前边会保留n
  • 2019年全国一二线城市程序员工资大调查

    我在4月1日到3日之间 抓取了某招聘网站的软件和互联网类招聘数据40万条 其中通过程序判断为程序员的14万条 地域方面 我选择了24个主要城市 这里的程序员包括普通程序员 架构师和算法工程师 美工等不计算在内 这点和2017年不同 如果你只
  • ftp

    1 ftp上传文件 1 1相关依赖
  • OpenMMLab_0【简介】

    1 项目动机 统一的深度学习框架 统一的算法框架和生态 自2018年开源以来已经能够实现很多算法 2 总体现状 3 总体框架概览 3 1 算法训练 部署一体化 3 2 算法框架介绍 MMDetection MMDetection3D 7 个
  • Bootstrap入门(一)

    前言 大家好 我是九歌 今天我要分享的内容是Bootstrap的入门 首先老规矩先上思维导图 提示 以下是本篇文章正文内容 下面案例可供参考 一 Bootstrap 学习一门新的技术我们终究都逃不过三个W What Why Where 1
  • Vue3.0

    teleport Teleport 提供了一种干净的方法 允许我们控制在 DOM 中哪个父节点下呈现 HTML 而不必求助于全局状态或将其拆分为两个组件
  • 《C++ Primer》学习笔记(十五):面向对象编程

    C Primer 学习笔记 十五 面向对象编程 抽象基类 访问控制与继承 构造函数与拷贝控制 文本查询程序再探 练习 面向对象编程的核心思想是数据抽象 继承和动态绑定 在C 语言中 当我们使用基类的引用 或指针 调用一个虚函数时将发生动态绑
  • python跟易语言的爬虫_用易语言写个简单的小爬虫其中的关键点

    一 请求头 ctrl L快捷键创建变量 变量名 类型 协议参数 类 POST数据类 请求头数据 文本型 协议参数 添加 v 4 52 0 请求头数据 协议参数 获取协议头数据 二 请求参数比如post 变量名 类型 请求data参数 类 P
  • 【负荷预测】基于神经网络的负荷预测和价格预测(Matlab代码实现)

    目录 1 概述 2 基于神经网络的负荷预测 Matlab实现 2 1 代码 2 2 结果 2 3 回归树模型的进一步改进 3 基于神经网络的价格预测 Matlab代码实现 4 阅读全文 Matlab代码 1 概述 这个例子演示了用MATLA
  • 《软件调试的艺术》学习笔记——GDB使用技巧摘要(3)——程序崩溃处理

    程序为什么会崩溃 内存中的程序布局 当某个错误导致程序突然和异常地停止执行时 程序崩溃 迄今为止最为常见的导致程序崩溃的原因是试图在未经允许的情况下访问一个内存位置 硬件会感知这件事 并执行对操作系统的跳转 Unix系列的平台上 操作系统一