当前位置: 首页 > news >正文

关于Linux下调试

关于Linux下调试

无论是内核(操作系统)还是应用程序,都存在需要调试的情况。
所谓工欲善其事,必先利其器。一个好的称手的工具,对于快速分析问题、定位问题,提高效率,非常有帮助。

除了工具,我们需要了解程序调试,到底调试什么?
首先,我们要保证程序正确运行,也就是逻辑要正确,完成预期的功能目标;
其次,我们要保证程序高效的运行,也就是逻辑要合理,以最小的代价完成最多的处理。

对于程序的世界来讲,开发者就是上帝,需要审视自己设计的世界是否按照自己的预期工作了。

代码的执行者是CPU,很多时候调试代码,就是大脑代替CPU跟踪代码的流转。工具,是帮助我们尽可能多的给CPU开窗户,让我们对实际代码逻辑的运行流程看的更清楚。

如果我们对CPU的组成再抽象一下,可以将代码的执行归纳总结如下:

在任意时间点,CPU的执行无非就是下述几种情况:

1 正常顺序执行某一应用进程的代码。关注CPU寄存器,内存进程结构,内存映射结构,进程堆栈区域。
2 正常顺序执行某一内核线程的代码。关注CPU寄存器,内存进程结构,内核堆栈区域。
3 发生中断,保护现场。现场包括CPU寄存器中保存的数据和当前指令地址以及堆栈。关注中断堆栈区域。
4 执行中断中顺序代码。关注中断堆栈区域。
5 执行中断返回代码。释放当前中断堆栈,恢复进入中断前的现场,包括CPU寄存器,下一条指令地址,堆栈等。
6 应用进程中指令跳转或函数调用
7 内核进程中指令跳转或函数调用
8 中断中指令跳转或函数调用
9 从用户空间切换到内核空间,CPU特权模式改变,系统调用传递参数
10 从内核空间返回到用户空间,CPU特别模式改变,系统调用返回
11 主动或被动调度,从应用进程切换到内核进程,切换进程上下文,CPU寄存器,内存,堆栈
12 主动或被动调度,从内核进程切换到应用进程,切换进程上下文,CPU寄存器,内存,堆栈
13 主动或被动调度,应用进程之间或内核进程之间切换,切换进程上下文,CPU寄存器,内存,堆栈

假设CPU可以被暂停,那么,在任何时刻(内核完成初始化),对CPU施法,让其暂停,观察当前的执行环境,都可以归到上面某一条之中

所有对内核和应用的调试技术,都是围绕着上述过程来展开的。
比如,逻辑调试,跟踪流程,统计调试,观察性能,都离不开上述基础。本质上,都是在上述场景中埋点或预留执行空间,插入获取信息的指令,从而得到采样数据。

http://www.lryc.cn/news/17903.html

相关文章:

  • 理解TP、FP、TN、FN
  • 软考中级有用吗
  • 计算机网络之IP协议(详解
  • Kubernetes之探针probe
  • 高性能低功耗4口高速USB2.0 HUB NS1.1S 兼容FE1.1
  • 通过VS Code轻松连接树莓派
  • 图纸等敏感文件数据外发时 如何确保效率和安全性?
  • 2023年CDGA考试-第4章-数据架构(含答案)
  • 理解随机游走
  • mqtt协议1- 简介和报文格式
  • 前端用动画快速实现骨架屏效果
  • Python入门(未完待续。。。)
  • 注解配置SpringMVC
  • 多项新规重磅发布,微信视频号近期需要关注这几点
  • Java调用第三方http接口的方式
  • 【跟我一起读《视觉惯性SLAM理论与源码解析》】第五章第六章 对极几何图优化库的使用
  • 从没想过开源 API 工具的 Mock 功能,这么好用
  • 智慧教室--智能管控系统
  • React的useLayoutEffect和useEffect执行时机有什么不同
  • C语言中#include<...>和#include“...“的区别
  • ubuntu本地访问nas
  • 第一章:网络参考模型
  • extends in typescript
  • 如何找回回收站删除的文件
  • Git系列——Git部署及应用
  • Java多线程(二)--线程相关内容
  • CF1692E Binary Deque 题解
  • rust方法和关联函数
  • 深度学习如何训练出好的模型
  • 智慧教室系统--重点设备监控系统