linux 源码 调试,开发一个Linux调试器(六):源码级逐步执行
我们计算编写这些函数异常简单的版本,但真正的调试器有 thread plan 的概念,它封装了所有的单步信息。例如,调试器可能有一些复杂的逻辑去决定断点的地位,然后有一些回调函数用于断定单步操作是否完成。这个中有异常多的基本举措措施,我们只采取一种朴实的办法。我们可能会心外埠跳过断点,但如不雅你愿意的话,你可以花一些时光把所有的细节都处理好。
系列文┞仿索引
跟着后面文┞仿的宣布,这些链接会逐渐生效。预备情况
断点
存放器和内存
Elves 和 dwarves
源码和旌旗灯号
源码级慢慢履行
源码级断点
调用栈展开
攫取变量
下一步
揭秘指令级慢慢履行
在前几篇博文中我们进修了 DWARF 信息以及它若何使我们将机械码和上层源码接洽起来。这一次我们经由过程为我们的调试器添加源码级慢慢调试将该常识应用于实际。
我们正在超出了自我。起首让我们经由过程用户接口揭秘指令级单步履行。我决定将它切分为能被其它部分代码应用的 single_step_instruction 和确保是否启用了某个断点的 single_step_instruction_with_breakpoint_check 两个函数。void debugger::single_step_instruction() {
ptrace(PTRACE_SINGLESTEP, m_pid, nullptr, nullptr);
wait_for_signal();
}
void debugger::single_step_instruction_with_breakpoint_check() {
//起首,检查我们是否须要停用或者启用某个断点
if (m_breakpoints.count(get_pc())) {
step_over_breakpoint();
}
else{
single_step_instruction();
}
}
正如以往,另一个敕令被集成到我们的 handle_command 函数:elseif(is_prefix(command,"stepi")) {
single_step_instruction_with_breakpoint_check();
auto line_entry = get_line_entry_from_pc(get_pc());
print_source(line_entry->file->path, line_entry->line);
}
应用新增的┞封些函数我们可以开端实现我们的源码级慢慢履行函数。
实现慢慢履行
对于彪炳 step_out,我们只是在函数的返回地址处设一个断点然后持续履行。我临时还不想推敲调用栈展开的细节 - 这些都邑在后面的部分介绍 - 但可以说返回地址就保存在栈帧开端的后 8 个字节中。是以我们会攫取栈指针然后在内存相对应的地址攫取值:void debugger::step_out() {
auto frame_pointer = get_register_value(m_pid, reg::rbp);
auto return_address = read_memory(frame_pointer+8);
bool should_remove_breakpoint = false;
if (!m_breakpoints.count(return_address)) {
set_breakpoint_at_address(return_address);
should_remove_breakpoint = true;
}
continue_execution();
if (should_remove_breakpoint) {
remove_breakpoint(return_address);
推荐阅读
run(getData) 在 JavaScript 的世比赛,所有代码都是单线程履行的,因为这个“缺点”,导致 JavaScript 的所有收集操作,浏览器事宜,都必须是异步履行。异步操作会在将来的某个>>>详细阅读
地址:http://www.17bianji.com/lsqh/36973.html
linux 源码 调试,开发一个Linux调试器(六):源码级逐步执行相关推荐
- linux内存地址断点,开发一个 Linux 调试器(三):寄存器和内存
上一篇博文中我们给调试器添加了一个简单的地址断点.这次,我们将添加读写寄存器和内存的功能,这将使我们能够使用我们的程序计数器.观察状态和改变程序的行为. 注册我们的寄存器 在我们真正读取任何寄存器之前 ...
- redis,memcached到nginx,底层网络io中剥离精髓丨C/C++Linux丨C++后端开发丨Linux服务器开发丨底层原理
redis,memcached到nginx,底层网络io中剥离精髓 1. redis单线程网络的优缺点 2. memcached多线程网络的并发优势 3. nginx多进程网络的优势 视频讲解如下,点 ...
- linux如何调试elf程序,开发一个Linux调试器就需要了解ELF和DWARF
到目前为止,可能你已经听到了关于调试信息或者关于除了解析代码以外的理解源代码的方法的DWARF的只言片语.今天,我们将介绍源代码级的调试信息的细节,以备在该系列的余下部分使用它. ELF和DWARF简 ...
- 开发一个 Linux 调试器(四):Elves 和 dwarves
https://linux.cn/article-8719-1.html 到目前为止,你已经偶尔听到了关于 dwarves.调试信息.一种无需解析就可以理解源码方式.今天我们会详细介绍源码级的调试信息 ...
- found dwarf version #039;4#039; linux,开发一个Linux调试器(四):Elves和dwarves
到目前为止,你已经偶尔听到了关于 dwarves.调试信息.一种无需解析就可以理解源码方式.今天我们会详细介绍源码级的调试信息,作为本指南后面部分使用它的准备. 系列文章索引 随着后面文章的发布,这些 ...
- 开发一个Linux调试器(八):堆栈展开
有时你需要知道的最重要的信息是什么,你当前的程序状态是如何到达那里的.有一个 backtrace 命令,它给你提供了程序当前的函数调用链.这篇文章将向你展示如何在 x86_64 上实现堆栈展开以生成这 ...
- c语言跳一跳辅助源码,.NET 开发一个微信跳一跳辅助程序(附源码)
原标题:.NET 开发一个微信跳一跳辅助程序(附源码) 来源:中国.NET研究协会 cnblogs.com/dotnet-org-cn/p/8149693.html 前言 微信更新了,出现了一个小游戏 ...
- 人工智能离前端并不远 一步步教你开发一个机器学习APP(附源码)
最近HBO电视网推出的美剧<硅谷Silicon Valley>席卷全球,里面有一个桥段介绍了超级有趣的iOS app- Not Hotdog.你甚至可以在APP Store上下载到它. 受 ...
- 挑战一天开发一个前后端小程序系统|源码公开,开箱即用
有个小伙伴找到我开发一个系统,这次他要考验我的效率,第一次遇到这种条件的. 一周开发出来给2000,3天开发出来4000,一天开发出来给5000. 都这样说了,那我还拖什么? 系统完事后,和他商讨了一 ...
最新文章
- 编程中new[]和delete[]应该如何使用?
- 5GS 协议栈 — Overview
- 学习笔记Hadoop(二)—— Hadoop介绍(2)——Hadoop 核心组件
- [图论]强联通分量+缩点 Summer Holiday
- python中的接口
- 数据结构那些事(二)
- uibinder表单提交_使用UIBinder的GWT自定义按钮
- 挑选回文串(二进制枚举)
- Git仓库完整迁移,包括分支和标签和日志
- python基础语法手册-python语法大全,python语法手册
- 一次接口超时排查,花费了我两个星期。。
- 可扩展多线程异步Socket服务器框架EMTASS 2.0 续
- 偶然翻开旧日记本,发现了好多的情诗!!!!
- 从美国人工智能年会看2017世界人工智能最新研究成果
- 八数码问题matlab实现,A* 算法解决八数码问题 matlab
- 推荐三款最佳的远程桌面管理工具
- 小米手机google play下载应用一直显示等待中的解决办法
- 代码审计--13--源代码审计思路(下)
- 基于python的dlib库的人脸识别
- JS/正则 验证 数字 电话号码 传真 邮箱 手机号码 邮编 日期