debugging - 反汇编程序在分析目标文件时如何维护寄存器的值?
问题描述
当我们使用gdb或任何反汇编程序分析目标文件时,我们会在其中放置断点。它随时显示寄存器的当前状态。可以有许多程序在后台运行。这些程序中的每一个也将使用这些寄存器并可以更改它们的值。
当其他进程可能不断更改它时,反汇编程序如何维护我们程序的寄存器值?
解决方案
反汇编程序objdump -d
不运行程序并且没有寄存器值。他们所拥有的只是机器代码,因此他们可以打印每条指令使用哪些寄存器,但不能打印指令运行时它将保存的值。
任何给定的指令(如dec edx
)都可以在程序的生命周期内多次运行,EDX 具有多个不同的值。因此,显然您不能只为反汇编列表中的指令静态打印单个寄存器值。
您在询问debuggers,它们确实运行程序以及在断点或单步处停止程序。
在 Linux、MacOS 或 Windows 等多任务操作系统中,操作系统提供系统调用来跟踪另一个进程,例如 Linux ptrace
。这让 GDB 可以插入断点或单步。并且当目标进程停止时,GDB 可以使用ptrace
读取保存的架构状态(寄存器值)。
在一个 CPU 上运行多个任务由操作系统完成,使用“上下文切换”保存旧任务的寄存器状态,并恢复新任务的状态。 每个任务都有自己的寄存器状态,只要它实际运行,就会加载到架构寄存器中。
这是基本的操作系统内容,如果您想了解更多信息,请获取教科书或搜索其中一些关键字。
推荐阅读
- php - 如何使用 migrate 创建望远镜
- javascript - 我们如何、何时以及为什么在 react JavaScript 中清理我们的组件?
- reactjs - 我可以在不使用 Apollo 的情况下使用 graphql 进行反应吗?
- c++ - setup() 中的 Arduino 和对象实例化
- excel - Excel 打印到 PDF 到文件夹
- r - 创建一个计数连续变量,根据 POSIXct 日期重置为 1
- rust - 在正确的设计模式上遇到问题
- android-studio - if 语句:赋值不是表达式,在这个上下文中只允许表达式 kotlin
- java - iOS UserDefaults 跨多个应用程序共享首选项 Android 等效项
- haskell - 如何诊断堆栈构建中的 ExitFailure 1?