作家
登录

开发一个Linux调试器(六):源码级逐步执行

作者: 来源: 2017-08-28 16:58:10 阅读 我要评论

  •     } 
  •     continue_execution(); 
  •     for (auto addr : to_delete) { 
  •         remove_breakpoint(addr); 
  •     } 
  • 这个函数有一点复杂,我们将它拆开来看。

    1. auto func = get_function_from_pc(get_pc()); 
    2. auto func_entry = at_low_pc(func); 
    3. auto func_end = at_high_pc(func); 

    at_low_pc 和 at_high_pc 是 libelfin 中的函数,它们能给我们指定函数 DWARF 信息条目标最小和最大年夜法度榜样计数器值。

    1. auto line = get_line_entry_from_pc(func_entry); 
    2. auto start_line = get_line_entry_from_pc(get_pc()); 
    3. std::vector<std::intptr_t> breakpoints_to_remove{}; 
    4. while (line->address < func_end) { 
    5.     if (line->address != start_line->address && !m_breakpoints.count(line->address)) { 
    6.         set_breakpoint_at_address(line->address); 
    7.         breakpoints_to_remove.push_back(line->address); 
    8.     } 
    9.     ++line; 

    我们须要移除我们设置的所有断点,以便不会泄漏出我们的慢慢履行函数,为此我们把它们保存到一个 std::vector 中。为了设置所有断点,我们轮回遍历行表条目直到找到一个不在我们函数范围内的。对于每一个,我们都要确保它不是我们当前地点的行,并且在这个地位还没有设置任何断点。

    1. auto frame_pointer = get_register_value(m_pid, reg::rbp); 
    2.     auto return_address = read_memory(frame_pointer+8); 
    3.     if (!m_breakpoints.count(return_address)) { 
    4.         set_breakpoint_at_address(return_address); 
    5.         to_delete.push_back(return_address); 
    6.     } 
    1. continue_execution(); 
    2. for (auto addr : to_delete) { 
    3.     remove_breakpoint(addr); 

    最后,我们持续履行直到射中它们中的个一一个断点,然后移除所有我们设置的临时断点。

    它并不美不雅,但临时先如许吧。

    当然,我们还须要将这个新功能添加到用户界面:

    1. else if(is_prefix(command, "step")) { 
    2.     step_in(); 
    3. else if(is_prefix(command, "next")) { 
    4.     step_over(); 
    5. else if(is_prefix(command, "finish")) { 
    6.     step_out(); 

    测试

    我经由过程实现一个调用一系列不合函数的简单函数来进行测试:

    1. void a() { 
    2.     int foo = 1; 
    3. void b() { 
    4.     

        推荐阅读

        浅谈JavaScript中的异步处理

      run(getData) 在 JavaScript 的世比赛,所有代码都是单线程履行的,因为这个“缺点”,导致 JavaScript 的所有收集操作,浏览器事宜,都必须是异步履行。异步操作会在将来的某个>>>详细阅读


      本文标题:开发一个Linux调试器(六):源码级逐步执行

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

    关键词: 探索发现

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

    网友点评
    自媒体专栏

    评论

    热度

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