作家
登录

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

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

  •     *(reinterpret_cast<uint64_t*>(&regs) + (it - begin(g_register_descriptors))) = value; 
  •     ptrace(PTRACE_SETREGS, pid, nullptr, &regs); 
  • 下一步是经由过程 DWARF 存放器编号查找。此次我会真正检查一个缺点前提以防我们获得一些奇怪的 DWARF 信息。

    1. uint64_t get_register_value_from_dwarf_register (pid_t pid, unsigned regnum) { 
    2.     auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), 
    3.                            [regnum](auto&& rd) { return rd.dwarf_r == regnum; }); 
    4.     if (it == end(g_register_descriptors)) { 
    5.         throw std::out_of_range{"Unknown dwarf register"}; 
    6.     } 
    7.     return get_register_value(pid, it->r); 
    1. std::string get_register_name(reg r) { 
    2.     auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), 
    3.                            [r](auto&& rd) { return rd.r == r; }); 
    4.     return it->name
    5. reg get_register_from_name(const std::string& name) { 
    6.     auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), 
    7.                            [name](auto&& rd) { return rd.name == name; }); 
    8.     return it->r; 

    最后我们会添加一个简单的赞助函数用于导出所有存放器的内容:

    1. void debugger::dump_registers() { 
    2.     for (const auto& rd : g_register_descriptors) { 
    3.         std::cout << rd.name << " 0x" 
    4.                   << std::setfill('0') << std::setw(16) << std::hex << get_register_value(m_pid, rd.r) << std::endl; 
    5.     } 

    正如你看到的,iostreams 有异常精确的接口用于美不雅地输出十六进制数据(啊哈哈哈哈哈哈)。如不雅你爱好你也可以经由过程 I/O 把持器来摆脱这种纷乱。


      推荐阅读

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

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


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

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

    关键词: 探索发现

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

    网友点评
    自媒体专栏

    评论

    热度

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