你可以在这里找到这篇博文的代码。
上一篇博文中我们给调试器添加了一个简单的地址断点。此次,我们将添加读写存放器和内存的功能,这将使我们可以或许应用我们的法度榜样计数器、不雅察状况和改变法度榜样的行动。
系列文┞仿索引
跟着后面文┞仿的宣布,这些链接会逐渐生效。
- 预备情况
- 断点
- 存放器和内存
- Elves 和 dwarves
- 源码和旌旗灯号
- 源码级慢慢履行
- 源码级断点
- 调用栈展开
- 攫取变量
- 下一步
注册我们的存放器
在我们真正攫取任何存放器之前,我们须要告诉调试器一些关于我们的目标平台的信息,这里是 x8664 平台。除了多组通用和专用目标存放器,x8664 还供给浮点和向量存放器。为了简化,我将跳过后两种存放器,然则你如不雅爱好的话也可以选择支撑它们。x86_64 也许可你像拜访 32、16 或者 8 位存放器那样拜访一些 64 位存放器,但我只会介绍 64 位存放器。因为这些简化,对于每个存放器我们只须要它的名称、它的 DWARF 存放器编号以及 ptrace 返回构造体中的存储地址。我应用范围列举引用这些存放器,然后我列出了一个全局存放器描述符数组,个中元素次序和 ptrace 中存放器构造体雷同。
- enum class reg {
- rax, rbx, rcx, rdx,
- rdi, rsi, rbp, rsp,
- r8, r9, r10, r11,
- r12, r13, r14, r15,
- rip, rflags, cs,
- orig_rax, fs_base,
- gs_base,
- fs, gs, ss, ds, es
- };
- constexpr std::size_t n_registers = 27;
- struct reg_descriptor {
- reg r;
- int dwarf_r;
- std::string name;
- };
- const std::array<reg_descriptor, n_registers> g_register_descriptors {{
- { reg::r15, 15, "r15" },
- { reg::r14, 14, "r14" },
- { reg::r13, 13, "r13" },
- { reg::r12, 12, "r12" },
- { reg::rbp, 6, "rbp" },
- { reg::rbx, 3, "rbx" },
- { reg::r11, 11, "r11" },
- { reg::r10, 10, "r10" },
- { reg::r9, 9, "r9" },
- { reg::r8, 8, "r8" },
- { reg::rax, 0, "rax" },
- { reg::rcx, 2, "rcx" },
- { reg::rdx, 1, "rdx" },
- { reg::rsi, 4,
推荐阅读
在当局改革范畴,淄博市大年夜力履行“互联网+”政务办事,开通网上干事大年夜厅、微信"大众,"办事平台、移动办公APP等网上申报功能,干事企业和群众足不出户就可解决审批,市级网上解决事项零次劈叉和一次>>>详细阅读
地址:http://www.17bianji.com/lsqh/36047.html
1/2 1