Linux断点方法,Linux:断点原理与实现

本文介绍了Linux下断点的工作原理,通过GDB和Ptrace系统调用展示了如何在特定函数上设置断点。通过解析ELF文件获取函数地址,并使用Ptrace控制进程执行,实现简单的断点功能。最后,讨论了优化和扩展断点功能的可能性。
摘要由CSDN通过智能技术生成

前言

从事编程工作的我们,总有调试的时刻,不管是通过 IDE 调试开发中的代码,还是通过 GDB 排查正在运行的进程。

特别是经常使用 GDB 的童鞋,对它提供的强大功能更加如数家珍,其中就不乏 breakpoint(断点)。

刚好最近做到 Ptrace 相关的实验,也顺便撸了这篇小文来分享下 断点 当中的道理。

简单 GDB 示范

// test.cpp

#include

#include

void test1(){

std::cout << "test" << std::endl;

}

int main() {

while (true) {

std::cout << "main: " << getpid() << std::endl;

test1();

sleep(1);

}

return 0;

}

编译运行

g++ -std=c++11 test.cpp && ./a.out

// 输出

main: 22346

test

main: 22346

test

main: 22346

...

开启 GDB,并且在 test1 函数断点

sudo gdb a.out -p 22346

// 输出

... (省略打印的信息, 直接输入命令)

(gdb) break test1 // 在 test1 函数断点

Breakpoint 1 at 0x40091a

(gdb) c // 继续运行

Continuing.

Breakpoint 1, 0x000000000040091a in test1() ()

(gdb) i r rip // 查看 cpu 下一条指令的内容

rip 0x40091a 0x40091a

回头看 a.out 的输出,可以看到已经停在 main: 5693 不再打印了,而进程状态也变成了 T:

1460000021870754

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值