如你所见,我标记本电脑上的 int 是一个 4 字节的有符号整数类型,float是一个 4 字节的浮点数。整数数组类型经由过程指向 int 类型作为其元素类型,sizetype(可以认为是 size_t)作为索引类型,它具有 2a 个元素。 test * 类型是 DW_TAG_pointer_type,它引用 test DIE。
实现简单的变量攫取器
如上所述,libelfin 将为我们处理大年夜部分复杂性。然则,它并没有实现用于表示可变地位的所有办法,并且在我们的代码中处理这些将变得异常复杂。是以,我如今选择只支撑 exprloc。请根据须要添加对更多类型表达式的支撑。如不雅你真的有勇气,请提交补丁到 libelfin 中来赞助完成须要的支撑!
处理变量主如果将不合部分定位在存储器或存放器中,攫取或写入与之前一样。为了简单起见,我只会告诉你若何实现攫取。
起首我们须要告诉 libelfin 若何大年夜我们的过程中攫取存放器。我们创建一个持续自 expr_context 的类并应用 ptrace 来处理所有内容:
接着我们确保它是一个 exprloc,并请求 libelfin 来评估我们的表达式:
最后我们可以将它添加到我们的敕令解析器中:
- class ptrace_expr_context : public dwarf::expr_context {
- public:
- ptrace_expr_context (pid_t pid) : m_pid{pid} {}
- dwarf::taddr reg (unsigned regnum) override {
- return get_register_value_from_dwarf_register(m_pid, regnum);
- }
- dwarf::taddr pc() override {
- struct user_regs_struct regs;
- ptrace(PTRACE_GETREGS, m_pid, nullptr, ®s);
- return regs.rip;
- }
- dwarf::taddr deref_size (dwarf::taddr address, unsigned
推荐阅读
截止今朝开源中国收录了 44513 款开源项目,囊括了最热点的各类开源项目,而软件的评分在必定程度上代表了软件的质量和热度,而重要用 HTML/CSS 编写的项目中也有很多值得救鉴的处所,是以>>>详细阅读
本文标题:开发一个Linux调试器(九):处理变量
地址:http://www.17bianji.com/lsqh/37722.html
1/2 1