OS15.【Linux】gdb调试器的简单使用

📅 发布时间:2026/10/17 5:42:13
OS15.【Linux】gdb调试器的简单使用
目录1.调试前的准备活动2.断点的分类补充: Intel CPU的断点寄存器3.测试代码3.几个命令list(简称l)list 函数名(或者l 函数名)list 行号(或者l 行号)break(简称b)break 行号(或b 行号)break 函数名break 文件名:函数名run(简称r)info(简称i)info break(简称i b)info localsdelete(简称d)delete 编号(简称d 编号)delete breakpoints(简称d breakpoints)next(简称n)step(简称s)print(简称p)print 变量名(简称p 变量名)displayundisplayuntil 行号finishreturncontinue(简称c)disableenableset varbreaktrace(简称bt)quit(简称q)4.gdb的口袋书5.gdb权威书1.调试前的准备活动前置知识:linux的gcc或g编译器生成的可执行文件默认是release版本的,而如果想方便地使用gdb调试可执行文件,需要debug版本的,因此在使用gcc或g编译时建议加上-g选项来生成debug版本的程序注:如果使用gdb调试release版本的可执行文件会显示no debugging symbols foundgcc test.c -o test.out -stdc992.断点的分类一共两类断点:软件断点和硬件断点软件断点:将软件断点指令临时替换原指令来达到暂停执行程序的作用这里以x86为例,对某个指令下断点,操作系统会将该指令的下一条指令的第一个字节修改为int 3指令,即0xCC,当CPU执行到这里的时候调到对应的软中断处理程序中去运行,我们在这个软中断处理例程中可以看到我们运行的这个进程运行时的一些寄存器参数,以此让我们用户可以看到断点前面变量的值硬件断点:顾名思义,通过硬件来下断点,简单叙述原理:通过微处理器调试模块中的比较器(comparators),比较器被设置为一个程序计数器PC的值,当值匹配时会触发断点暂停程序参考文献:https://www.beningo.com/embedded-basics-hward-and-soft-breakpoints/#摘下来重点的两段:The first breakpoint type that is used and generally preferred is a hardware breakpoint. Every microcontroller has comparators which are part of the debugging module. For example, the ARM Cortex-M microcontrollers can have 2 – 4 comparators in their debugging module.The comparator is set with a program counter value and when a match occurs, a debug event is raised and the program halts.Hardware breakpoints are the fastest and the most used breakpoint.A software breakpoint is typically an instruction thattemporarily replaces an instruction in RAM that is either an illegal instruction and causes a fault or is designed to cause the application to break.A perfect example is the BKPT instruction in the ARM instruction set. When the CPU reaches this instruction, it halts execution. Software breakpoints can only be used for application code that reside in RAM. The reason is that an instruction is literally swapped out for the breakpoint instruction. Once a developer steps past the BKPT, the originally code that would have executed at that location is ran.补充: Intel CPU的断点寄存器从Intel 80386 CPU开始就有断点寄存器了,属于硬件断点的范畴,有DR0~DR7,这些断点寄存器是方便程序员调试的摘自的Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C, 3D): System Programming Guide的Chapter 19 Debug, Branch Profile, TSC, and Intel® Resource Director Technology (Intel® RDT) Features的DR0~DR7的具体格式如下:32位:结论: DR0~DR3用于存储需要下硬件断点的线性地址,显然,Intel CPU最多只支持下4个硬件断点,而DR4~DR7的大致作用参见理论和实践 调试寄存器DRx - 滴水逆向联盟 - Powered by Discuz!3.测试代码本文将围绕下面的C语言代码展开调试:#include stdio.h int loopfunction(int times) { printf(Loopfunction is running......\n); int sum0; for (int i0;itimes;i) { sumi; } return sum; } int main() { printf(Main function is running......\n); int retloopfunction(100); printf(ret%d\n,ret); printf(return 0.\n); return 0; }编译命令:gcc test.c -o test.out -stdc99 -g使用gdb test.out来启动调试3.几个命令gdb全称是gnudebugger,是GNU开源组织发布的一款调试器在线参考手册:https://sourceware.org/gdb/pdf参考手册下载链接:https://sourceware.org/gdb/current/onlinedocs/gdb.pdflist(简称l)作用:打印源代码(必须有源代码文件,否则无法打印,list显示的源代码不是反编译出来的)默认情况下一次只能显示10行继续执行该命令会向下展示代码:(其实按回车也可以,按回车可以执行之前执行过的代码)list 函数名(或者l 函数名)作用:查看对应函数内的代码list 行号(或者l 行号)作用:显示指定行号周围的代码break(简称b)作用: 下软件断点在VS上可以点击行号的旁边来下断点break 行号(或b 行号)在gdb中,使用b 行号对处于指定行号下的代码下软件断点注意:退出调试后断点是不会保存的break 函数名作用:在某个函数开头设置断点break 文件名:函数名作用:为某个文件的某个函数下断点,适合跨文件调试run(简称r)作用:运行程序,如果有断点会停下来例如在int retloopfunction(100);处下断点,再运行info(简称i)info break(简称i b)查看断点其中的Enb是Enable是缩写,指断点是否开启,开启是y,关闭是ninfo locals作用:查看局部变量Visual Studio也有这个功能delete(简称d)delete 编号(简称d 编号)作用:删除断点,注意加的是编号不是行号查看断点的编号: info b的打印结果的第一列(Num)delete breakpoints(简称d breakpoints)作用:删除所有断点next(简称n)作用:逐过程调试,即逐行代码调试,但遇到函数调用不进入函数内部Visual Studio上的逐过程可按F10例如分别在int ret loopfunction(100);下断点,且这个断点是开启的执行到断点处再执行n命令,会发现并没有进入函数内部step(简称s)作用:逐语句调试,即逐行代码调试,遇到函数调用会进入函数内部Visual Studio上的逐过程可按F11例如分别在int ret loopfunction(100);下断点,且这个断点是开启的执行到断点处再执行n命令,会发现进入了函数内部print(简称p)print 变量名(简称p 变量名)当然不仅仅可以查看变量名,也可以查看变量的地址display作用:长显示,能边调试边查看变量类似于Visual Studio的监视窗口undisplayundisplay编号可以取消对应编号的值的显示until 行号作用:跳出循环(前提是循环内没有断点,否则会重新回到里面),指定程序运行到某一行就停下来finish作用:执行完当前函数并回到上一层调用处停下来return和finish不同的是:立即结束执行当前函数并返回continue(简称c)作用:从一个断点直接运行到下一个断点disable作用:禁用断点(不删断点,但让断点不触发)在Visual Studio里面可以右击禁用断点enable作用:启用断点在Visual Studio里面也可以右击启用断点set var作用:设置变量值breaktrace(简称bt)作用:查看各级函数调用及参数类似Visual Studio里面的调用堆栈的功能例如进入到loopfunction里面,执行bt命令quit(简称q)作用:退出调试4.gdb的口袋书推荐《GDB Pocket Reference Debugging Quickly Painlessly With GDB (Arnold Robbins)》书5.gdb权威书《Debugging with GDB - the GNU Source LevelDebugger》书