攫取将由我们 debugger 类中的 read_variables 函数处理:
- void debugger::read_variables() {
- using namespace dwarf;
- auto func = get_function_from_pc(get_pc());
- //...
- }
某一给准时刻的内存中变量的地位应用 DW_AT_location 属性编码在 DWARF 信息中。地位描述可所以单个地位描述、复合地位描述或地位列表。
- 简单地位描述:描述了对象的一个持续的部分(平日是所有部分)的地位。简单地位描述可以描述可寻址存储器或存放器中的地位,或缺乏地位(具有或不具有已知值)。比如,DW_OP_fbreg -32: 一个全部存储的变量 - 大年夜客栈帧基址开端的32个字节。
- 复合地位描述:根据片段描述对象,每个对象可以包含在存放器的一部分中或存储在与其他片段无关的存储器地位中。比如, DW_OP_reg3 DW_OP_piece 4 DW_OP_reg10 DW_OP_piece 2:前四个字节位于存放器 3 中,后两个字节位于存放器 10 中的一个变量。
- 地位列表:描述了具有有限生计期或在生计期内更改地位的对象。比如:
我们膳绫擎做的第一件事是找到我们今朝进入的函数,然后我们须要轮回拜访该函数中的条目来寻找变量:
- for (const auto& die : func) {
- if (die.tag == DW_TAG::variable) {
- //...
- }
- }
我们经由过程查找 DIE 中的 DW_AT_location 条目获取地位信息:
- auto loc_val = die[DW_AT::location];
- if (loc_val.get_type() == value::type::exprloc) {
- ptrace_expr_context context {m_pid};
- auto result = loc_val.as_exprloc().evaluate(&context);
如今我们已经评估了表达式,我们须要攫取变量的内容。它可以在内存或存放器中,是以我们将处理这两种情况:
- switch (result.location_type) {
- case expr_result::type::address:
- {
- auto value = read_memory(result.value);
- std::cout << at_name(die) << " (0x" << std::hex << result.value << ") = "
- << value << std::endl;
- break;
- }
-
推荐阅读
截止今朝开源中国收录了 44513 款开源项目,囊括了最热点的各类开源项目,而软件的评分在必定程度上代表了软件的质量和热度,而重要用 HTML/CSS 编写的项目中也有很多值得救鉴的处所,是以>>>详细阅读
本文标题:开发一个Linux调试器(九):处理变量
地址:http://www.17bianji.com/lsqh/37722.html
1/2 1