
跟着后面文┞仿的宣布,这些链接会逐渐生效。
- 预备情况
- 断点
- 存放器和内存
- Elves 和 dwarves
- 源码和旌旗灯号
- 源码层慢慢履行
- 源码层断点
- 调用栈
- 攫取变量 10.之后步调
断点是若何形成的?
有两种类型的断点:硬件和软件。硬件断点平日涉及到设置与体系构造相干的存放器来为你产生断点,而软件断点则涉及到修改┞俘在履行的代码。在这篇文┞仿中我们只会存眷软件断点,因为它们比较简单,并且可以设置随便率性独断点。在 x86 机械上任一屎牌?最多只能有 4 个硬件断点,然则它们能让你在攫取或者写入给定地址时触发,而不是只有现代码履行到那边的时刻。
第一个问题的谜底显然是 ptrace。我们之前已经用它为我们的法度榜样设置跟踪并持续法度榜样的履行,但我们也可以用它来读或者写内存。
当履行到断点时,我们的更改要让处理器暂停并给法度榜样发送旌旗灯号。在 x86 机械上这是经由过程 int 3 重写该地址上的指令实现的。x86 机械有个中断向量表(interrupt vector table),操作体系能用它来为多种事宜注册处理法度榜样,例如页故障、保护故障和无效操作码。它就像是注册缺点处理回调函数,然则是在硬件层面的。当处理器履行 int 3 指令时,控制权就被传递给断点中断处理器,对于 Linux 来说,就是给过程发送 SIGTRAP 旌旗灯号。你可以鄙人图中看到这个过程,我们用 0xcc 覆盖了 mov 指令的第一个字节,它是 init 3 的指令代码。

断点
谜题的最后一个部分是调试器若何被告诉中断的。如不雅你回想前面的文┞仿,我们可以用 waitpid 来监听被发送给被调试的法度榜样的旌旗灯号。这里我们也可以如许做:设置断点、持续履行法度榜样、调用 waitpid 并等待直到产生 SIGTRAP。然后就可以经由过程打印已运行到的源码地位、或改变有图形用户界面的调试器中存眷的代码行,将这个断点缀达给用户。
实现软件断点
我们会实现一个 breakpoint 类来表示某个地位的断点,我们可以根据须要启用或者停用该断点。
在该系列的第一部分,我们写了一个小的过程启动器,作为我们调试器的基本。在这篇博客中,我们会进修在 x86 Linux 上断点是若何工作的,以及若何给我们对象添加设置断点的才能。
- void debugger::handle_command(const std::string& line) {
- auto args = split(line,' ');
- auto command = args[0];
- if (is_prefix(command, "cont")) {
- continue_execution();
- }
- else if(is_prefix(command, "break")) {
- std::string addr {args[1], 2}; //naively assume that the user has written 0xADDRESS
- set_breakpoint_at_address(std::stol(addr, 0, 16));
- }
- else {
- std::cerr << "Unknown command\n";
- }
- }
- class breakpoint {
- public:
- breakpoint(pid_t pid, std::intptr_t addr)
- : m_pid{pid}, m_addr{addr}, m_enabled{false}, m_saved_data{}
- {}
- void enable();
- void disable();
- auto is_enabled() const -> bool {
推荐阅读
《筹划》强调,“十三五”时代金融业要周全支撑深化改革,积极对标国际先辈,推动立异普惠成长,保持安然与成长并重,并环绕兼顾监管体系重要性金融机构、兼顾监管金融控股公司>>>详细阅读
本文标题:开发一个Linux调试器(二):断点
地址:http://www.17bianji.com/lsqh/35948.html
1/2 1

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