调试器中断点是如何设置?.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
调试器中的断点是如何设置的? 调试器应该每一个程序员都会用,但肯定不是每一个人都知 是怎么回事。 我对调试器非常着迷。它们太可爱了,我最近开发了一个小巧、非常基础的调试器,作为我 的一个小项目。在这篇博文中,我将记录学到的一些如何设置断点的知识。本文可以被分为如下 几个小节。 什么是断点?什么是调试器?设置断点,调试器需要做什么?调试器如何暂停被调试进程? 什么是断点? 断点是程序中的某一点,一旦程序运行到这一点就会停止。 什么是调试器? 你可以认为调试器是这样一个程序,它使用 forks() 创建一个子进程,然后调用 execl() 加载准 备调试的进程。我的代码里使用 execl(),但是任何 exec 家族的系统调用函数均可使用。 下面是 run_child() 函数,在其中调用了 execl() 函数,并传入待调试进程的可执行文件名称及 路径作为参数。 我们看到在调用 execl() 之前调用 ptrace()。我们暂时不要深究 ptrace() 的细节,虽然理解它 对理解调试器工作原理非常重要。稍后我们再讨论它。 现在我们有两个活跃进程: 作为父进程的调试器。作为子进程的被调试进程。 现在让我们以一种简化的方式,抽象理解一下调试器通过哪些工作,才能在子进程中设置 断点。调试器需要子进程在断点处停下来,那么该怎么做呢? 调试器需要做些什么才能设置一个断点? 更多精彩攻略访问 1 我们首先仔细研究一番“设置一个断点”这句话。我们知 ,当一个进程处于运行状态时,它的 指令会被处理器依次执行。那么指令加载在哪里呢?在进程的虚拟内存的 text/code 段中! 我们设置一个断点,希望被调试进程可以在指定点暂停。也就是说,我们希望被调试程序在 某条指令之前停下来。什么指令可以实现呢?如果在函数开始处设置一个断点,这条指令就是函 数的第一条指令;如果在源码中某一行设置断点,这条指令,就是在该行对应的若干指令之前的 那条。 那么,调试器需要让被调试进程就在执行这条指令时,停下来。 在我的项目里,我使用截图中下划线标注的指令。 调试器如何使被调试进程在执行指定指令前暂停? 调试器在被调试进程启动时,就将被调试进程的某条指令 (或者某条指令的一部分),替换 为可产生一个软中断的指令。因此,当这条被修改的指令被处理器执行时,就会产生 SIGTRA P 信号,这就足以使得进程停止了。这里,我略过了很多细节,不过随着我们的进展,都会逐渐明 朗的。 好了,我们首先探讨一下,调试器如何修改一条指令? 一系列指令保存在进程的 text 段,并在载入时由虚拟内存进行映射。所以,要想修改指令, 调试器需要知 那条指令的地址。 调试器如何找到一条指令的地址? 如果你编译 / ++ 程序,你可以使用 “-g” 参数,令编译器生成一些额外信息。这些额外信 息中,包含了上述映射信息,并被保存在一种称之为“DWA RF” 格式的对象文件中。在 Linux 系 统上,DWA RF 格式被用于在 ELF 文件中保存调试信息。是不是很 ool !ELF 是 Executable Linkable Format (可执行连接格式)的意思。这是一种表示对象文件、可执行文件、共享库的 格式。 调试器用什么指令替代了原有指令? 调试器将原有指令所在位置的第一个字节,重写为 “int 3”。“int 3” 是一个单字节操作码,也就 是说,调试器只需要修改指定内存地址的第一个字节即可。 更多精彩攻略访问 2 “int 3”是什么指令?“int n”指令会调用一个异常回调,这个回调由操作数 n 指定。“int 3”会产 生一个到调试异常回调的调用。该回调函数是内核代码的一部分,会向目标进程发出 SIGTRA P 信号,在我们的例子中,这个进程就是被调试进程。 调试器是什么时候、如何改变被调试进程的指令的? 终于到了见证奇迹的时刻!我们将会使用一个非常强大的系统调用—— ptrace()。 我们先了

文档评论(0)

0520 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档