作家
登录

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

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

"write")) { 
  •             std::string val {args[3], 2}; //assume 0xVAL 
  •             write_memory(std::stol(addr, 0, 16), std::stol(val, 0, 16)); 
  •         } 
  •     } 
  • 给 continue_execution 打补丁

    在我们测试我们的更改之前,我们如今可以实现一个更健全的 continue_execution 版本。因为我们可以获取法度榜样计数器,我们可以检查我们的断点映射来断定我们是否处于一个断点。如不雅是的话,我们可以停用断抱病在持续之前跳过它。

    为了清楚和简洁起见,起首我们要添加一些赞助函数:

    就快完成啦,如今我们已经有了存放器名称查找:

    然后我们可以编写函数来跳过断点:

    如今我们会给我们的用户界面添加敕令:

    1. void debugger::step_over_breakpoint() { 
    2.     // - 1 because execution will go past the breakpoint 
    3.     auto possible_breakpoint_location = get_pc() - 1; 
    4.     if (m_breakpoints.count(possible_breakpoint_location)) { 
    5.         auto& bp = m_breakpoints[possible_breakpoint_location]; 
    6.         if (bp.is_enabled()) { 
    7.             auto previous_instruction_address = possible_breakpoint_location; 
    8.             set_pc(previous_instruction_address); 
    9.             bp.disable(); 
    10.             ptrace(PTRACE_SINGLESTEP, m_pid, nullptr, nullptr); 
    11.             wait_for_signal(); 
    12.             bp.enable(); 
    13.         } 
    14.     } 

    起首我们检查当前法度榜样寂?骥的值是否设置了一个断点。如不雅有,起首我们把履行返回到断点之前,停用它,跳过本来的指令,再从新启用断点。

    wait_for_signal 封装了我们常用的 waitpid 模式:

    1. void debugger::wait_for_signal() { 
    2.     int wait_status; 
    3.     auto options = 0; 
    4.     waitpid(m_pid, &wait_status, options); 

    最后我们像下面如许重写 continue_execution:

    1. void debugger::continue_execution() { 
    2.     step_over_breakpoint(); 
    3.     ptrace(PTRACE_CONT, m_pid, nullptr, nullptr); 
    4.     wait_for_signal(); 

    测试效不雅

    如今我们可以攫取和修改存放器了,我们可以对我们的 hello world 法度榜样做一些有意思的更改。类似第一次测试,再次测验测验在 call 指令处设置断点然后大年夜那边持续履行。你可以看到输出了 Hello world。如今是有趣的部分,在输出调用后设一个断点、持续、将 call 参数设置代码的地址写入法度榜样计数器(rip)并持续。因为法度榜样计数器把持,你应当再次看到输出了 Hello world。为了以防你不肯定在哪里设置断点,下面是我上一篇博文中的 objdump 输出:

    1. 0000000000400936 <main>: 
    2.   400936:   55                      push   rbp 

    3.   推荐阅读

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

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


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

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

    关键词: 探索发现

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

    网友点评
    自媒体专栏

    评论

    热度

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