作家
登录

开发一个Linux调试器(三):寄存器和内存

作者: 来源: 2017-07-05 16:07:24 阅读 我要评论

你可以在这里找到这篇博文的代码。

开辟一个Linux调试器(三):存放器和内存

上一篇博文中我们给调试器添加了一个简单的地址断点。此次,我们将添加读写存放器和内存的功能,这将使我们可以或许应用我们的法度榜样计数器、不雅察状况和改变法度榜样的行动。

系列文┞仿索引

跟着后面文┞仿的宣布,这些链接会逐渐生效。

  • 预备情况
  • 断点
  • 存放器和内存
  • Elves 和 dwarves
  • 源码和旌旗灯号
  • 源码级慢慢履行
  • 源码级断点
  • 调用栈展开
  • 攫取变量
  • 下一步

注册我们的存放器

在我们真正攫取任何存放器之前,我们须要告诉调试器一些关于我们的目标平台的信息,这里是 x8664 平台。除了多组通用和专用目标存放器,x8664 还供给浮点和向量存放器。为了简化,我将跳过后两种存放器,然则你如不雅爱好的话也可以选择支撑它们。x86_64 也许可你像拜访 32、16 或者 8 位存放器那样拜访一些 64 位存放器,但我只会介绍 64 位存放器。因为这些简化,对于每个存放器我们只须要它的名称、它的 DWARF 存放器编号以及 ptrace 返回构造体中的存储地址。我应用范围列举引用这些存放器,然后我列出了一个全局存放器描述符数组,个中元素次序和 ptrace 中存放器构造体雷同。

  1. enum class reg { 
  2.     rax, rbx, rcx, rdx, 
  3.     rdi, rsi, rbp, rsp, 
  4.     r8,  r9,  r10, r11, 
  5.     r12, r13, r14, r15, 
  6.     rip, rflags,    cs, 
  7.     orig_rax, fs_base, 
  8.     gs_base, 
  9.     fs, gs, ss, ds, es 
  10. }; 
  11. constexpr std::size_t n_registers = 27; 
  12. struct reg_descriptor { 
  13.     reg r; 
  14.     int dwarf_r; 
  15.     std::string name
  16. }; 
  17. const std::array<reg_descriptor, n_registers> g_register_descriptors {{ 
  18.     { reg::r15, 15, "r15" }, 
  19.     { reg::r14, 14, "r14" }, 
  20.     { reg::r13, 13, "r13" }, 
  21.     { reg::r12, 12, "r12" }, 
  22.     { reg::rbp, 6, "rbp" }, 
  23.     { reg::rbx, 3, "rbx" }, 
  24.     { reg::r11, 11, "r11" }, 
  25.     { reg::r10, 10, "r10" }, 
  26.     { reg::r9, 9, "r9" }, 
  27.     { reg::r8, 8, "r8" }, 
  28.     { reg::rax, 0, "rax" }, 
  29.     { reg::rcx, 2, "rcx" }, 
  30.     { reg::rdx, 1, "rdx" }, 
  31.     { reg::rsi, 4, 
     1/6    1 2 3 4 5 6 下一页 尾页

      推荐阅读

      山东淄博以“互联网+”改革促老工业城市转型发展

    在当局改革范畴,淄博市大年夜力履行&ldquo;互联网+&rdquo;政务办事,开通网上干事大年夜厅、微信"大众,"办事平台、移动办公APP等网上申报功能,干事企业和群众足不出户就可解决审批,市级网上解决事项零次劈叉和一次>>>详细阅读


    本文标题:开发一个Linux调试器(三):寄存器和内存

    地址:http://www.17bianji.com/lsqh/36047.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)