gdb工作的基本原理

来源:互联网 发布:淘宝装修全能助手 编辑:程序博客网 时间:2024/05/16 19:46

Gdb组成部分
GDB由三个部分组成:
(1)用户接口user interface,除支持传统的CLI接口还支持mi接口(ddd等工具使用)
(2)符号处理层symbol handling,当gdb ./debugme后GDB会读取文件的符号信息,之后的原代码,变量/函数/类型的显示都由该部分进行(everything you can do without live process)。
(3)目标系统处理层target system handling。包括执行控制,断点设置,单步执行,堆栈分析等操作都有该部分来进行。
Gdb使用技巧
1)设置断点的方法包括:函数,行号,if条件断点express,这些前面都可以跟上文件名。另外还可以设置地址断点:b *0x8048424.
2)GDB用来分析core文件,启动格式:gdb debugme core.xyz
3)开启core文件生成的方法是: ulimit -c unlimited
4)在不同函数的调用栈上切换及查看当前信息:bt/frame XX/up/down/info frame/args/locals
5)调试一正运行的进程:gdb debugme pid或者gdb debugme + attach pid + detach,类似的应用还有:strace/ltrace/truss
6)如果某个线程/进程处于死锁状态,还可以通过gcore pid来手动生成core文件来分析当前线程/进程的状态,然后利用GDB来分析, gcore使用方法:gcore pid,注意被调试的进程会临时性停止去生成core文件
7)查看函数的反汇编指令:disassemble fun_name
8)汇编指令级别的单步执行:ni/si,显示当前执行的汇编指令: x/i $pc
9)查看寄存器的内容:info registers/all-registers
10)查看某地址开始的内容:x/num 0xYYYYYYY 查看从0xYYYYYYY开始的num个单元内容;p 输出数组内容
11)在函数调试中途强制返回:return ;
12)向被调试程序发送指定信号:在任意一点ctrl+C进入gdb调试命令行,然后:signal 1-15

gdb的断点是基于信号(signal)实现的
在某个地址增加一个断点,实际上就是修改那个地址的代码,把原来的代码替换成INT 3指令,同时让gdb捕获这个signal并做相应的处理:包括执行被替换掉的指令,并跳转回来。
因此,只要断点不被走到,那么断点就不会影响程序的运行效率;因为程序的其他地方都没改变,该怎么运行还是怎么运行。

gdb在遇到断点之后可以做很多事情
包括:
停下来等用户处理
自动继续
自动执行一些gdb指令(用commands命令可以配置断点的自动执行)
判断条件是否要停下来(这就是大名鼎鼎的条件断点)

在走到断点之后,不管是路过还是停下来,都会影响性能
因为通常到了断点就会通过INT3停下来。
只是条件断点有点特别,它分为软件和硬件两种。这是因为条件断点这个需求太普遍了,因此有人就想了一个办法从硬件支持一部分:在x86平台,某些条件断点可以不插入INT 3,而是插入一个其他指令,当程序走到这个地址的时候,并不是直接发出INT 3信号,而是先去比较一下特定寄存器和某个地址的内容,再决定要不要INT 3。
如果能采用硬件条件断点,会比软件条件断点的性能好很多。搜索‘硬件断点寄 存器’会找到更多信息。
Reference
1. GDB调试-基础篇
2. GDB调试-实现断点
3. GDB调试-调试信息
4. gdb使用及原理
5. GDB中断原理

0 0