- class debugger {
- public:
- debugger (std::string prog_name, pid_t pid)
- : m_prog_name{std::move(prog_name)}, m_pid{pid} {
- auto fd = open(m_prog_name.c_str(), O_RDONLY);
- m_elf = elf::elf{elf::create_mmap_loader(fd)};
- m_dwarf = dwarf::dwarf{dwarf::elf::create_loader(m_elf)};
- }
- //...
- private:
- //...
- dwarf::dwarf m_dwarf;
- elf::elf m_elf;
- };
我们应用了 open 而不是 std::ifstream,因为 elf 加载器须要传递一个 UNIX 文件描述符给 mmap,大年夜而可以将文件映射到内存而不是每次攫取一部分。
调试信息原语
下一步我们可以实现大年夜法度榜样计数器的值中提取行条目(line entry)以及函数 DWARF 信息条目(function DIE)的函数。我们大年夜 get_function_from_pc 开端:
这里我采取了朴实的办法,迭代遍历编译单位直到找到一个包含法度榜样计数器的,然后迭代遍历它的子节点直到我们找到相干函数(DW_TAG_subprogram)。正如我在上一篇中提到的,如不雅你想要的话你可以处理类似的成员函数或者内联等情况。
接下来是 get_line_entry_from_pc:
- dwarf::line_table::iterator debugger::get_line_entry_from_pc(uint64_t pc) {
- for (auto &cu : m_dwarf.compilation_units()) {
- if (die_pc_range(cu.root()).
推荐阅读
概述秦人不暇自哀,而后人哀之;后人哀之而不鉴之,亦使后人而复哀后人也! –论面向文档编程的重要性如不雅想看见识一小我写代码的功力,注释其实是区分老司机和小鲜肉的一个明显的分界线(有没有不雅察碘晾髑公司的>>>详细阅读
地址:http://www.17bianji.com/lsqh/36965.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示