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中断原理
- gdb工作的基本原理
- gdb的工作原理
- gdb的工作原理
- gdb的工作原理
- GDB的基本工作原理
- GDB的基本工作原理
- 【摘选】linux 设备驱动程序工作的基本原理
- DDR的基本原理与工作过程
- GDB的基本工作原理剖析
- GDB的基本工作原理剖析
- 邮件系统工作基本原理
- 计算机工作基本原理
- JMeter工作基本原理
- 三极管工作基本原理
- VPN基本原理之一(MPLS VPN的工作原理)
- VPN基本原理之一(MPLS VPN的工作原理)
- spring基础学习一(spring工作的基本原理)
- Storm记录级容错的基本原理(acker工作原理)
- dfs 和bfs
- BaseAdapter的使用
- Radar Installation
- 2016 Multi-University Training Contest 2 1005 Eureka
- Android自定义主题样式详解(结合自定义title栏讲解)
- gdb工作的基本原理
- Java 集合ArrayList与Vector的详解
- VNC和CUDA安装冲突
- UVA 10791 Minimum Sum LCM
- 【unity工程日志】写给自己看的CarControl.c#注释
- J2EE进阶(九)org.hibernate.LazyInitializationException: could not initialize proxy - no Session
- 安卓项目之淘忆2.0的代码实现之注册功能
- 读书笔记-现代操作系统-8多处理机-8.3虚拟化
- Eclipse常用操作及配置集锦