GNU调试器(英语:GNU Debugger,缩写:GDB),是GNU软件系统中的标准调试器,此外GDB也是个具有移携性的调试器,经过移携需求的调修与重新编译,如今许多的类UNIX操作系统上都可以使用GDB,而现有GDB所能支持调试的编程语言有C、C++、Pascal以及FORTRAN。
1. 编写一个C语言代码 a.c
int main()
{
int i = 5;
int b = 4;
int ret = i * b;
return ret ;
}
2. 以调试模式编译C语言源代码,输出 a.out
gcc -g a.c
3. 编译完成后,启动GDB调试工具,调试 a.out
gdb a.out
4. 如图,GDB调试基本命令 l b r n p i f q
- 用l查看源码,b设置断点为main函数,也可以按行号设置断点行b x ;
- r运行程序,n逐行运行程序,p显示变量值;
- i命令是info的缩写,
info locals
可以同时显示函数中多个变量的值。 - f命令是frame的缩写,显示当前源码和函数信息,q命令是quit的缩写。
5. GDB中输入命令时可以使用 TAB
自动补全,帮你列出相关命令
- 如图, 输入 i 按 TAB键,就显示 i 开头的命令
- 输入 info 后按空格,再按 TAB键,就显示当前命令的 参数命令可供选择
6. GDB在学习ARM汇编也很好用,可以显示源码,汇编码,寄存器值
layout asm
可以用来分窗口显示汇编码disassemble
命令显示汇编码;info registers
显示寄存器值(gdb) layout List of layout subcommands: layout asm -- Apply the "asm" layout. layout next -- Apply the next TUI layout. layout prev -- Apply the previous TUI layout. layout regs -- Apply the TUI register layout. layout split -- Apply the "split" layout. layout src -- Apply the "src" layout. (gdb) disassemble Dump of assembler code for function main: 0x2a0004e0 <+0>: push {r7} 0x2a0004e2 <+2>: sub sp, #20 0x2a0004e4 <+4>: add r7, sp, #0 0x2a0004e6 <+6>: movs r3, #5 0x2a0004e8 <+8>: str r3, [r7, #12] 0x2a0004ea <+10>: movs r3, #4 0x2a0004ec <+12>: str r3, [r7, #8] => 0x2a0004ee <+14>: ldr r3, [r7, #12] 0x2a0004f0 <+16>: ldr r2, [r7, #8] 0x2a0004f2 <+18>: mul.w r3, r2, r3 0x2a0004f6 <+22>: str r3, [r7, #4] 0x2a0004f8 <+24>: ldr r3, [r7, #4] 0x2a0004fa <+26>: mov r0, r3 0x2a0004fc <+28>: adds r7, #20 0x2a0004fe <+30>: mov sp, r7 0x2a000500 <+32>: ldr.w r7, [sp], #4 0x2a000504 <+36>: bx lr End of assembler dump. (gdb) info registers r0 0x1 1 r1 0xbefff784 3204446084 r2 0xbefff78c 3204446092 r3 0x4 4 r4 0xbefff638 3204445752 r5 0x0 0 r6 0x2a0003d1 704644049 r7 0xbefff610 3204445712 r8 0x0 0 r9 0x0 0 r10 0x2a011000 704712704 r11 0x0 0 r12 0xbefff6a0 3204445856 sp 0xbefff610 0xbefff610 lr 0xb6ef0a21 -1225848287 pc 0x2a0004ee 0x2a0004ee <main+14> cpsr 0xe0030 917552 fpscr 0x0 0