GDB调试助手用法详解

什么是GDB

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。

实战:GDB 调试程序

编写GDB 调试程序:

myMath.h

int add(int a, int b);
int reduce(int a, int b);
int multipy(int a, int b);
int devide(int a, int b);

myMath.c

#include "myMath.h"
int add(int a, int b){
    return a + b;
}

int reduce(int a, int b){
    return a - b > 0 ? a - b : 0;
}

int multipy(int a, int b){
    return a * b;
} 
int devide(int a, int b){
    return a/b;
}

本文采用静态库的方式编译:

编译库文件:使用编译器进行编译,将库文件编译成目标文件。
gcc -c myMath.c -o myMath.o

创建静态库:将目标文件打包成静态库文件。
ar rcs libmyMath.a myMath.o          语法:ar rcs lib静态库文件.a  编译库文件

创建可执行文件,并引入自定义静态库
gcc myMathDemo.c -o myMathDemo -L. -lmyMath       语法: gcc 源代码.c -o 可执行文件名称 -L. -l自定义静态库

可执行效果:
wz2012@LAPTOP-8R0KHL88:/mnt/e/ubuntu_code$ ./myMathDemo
请输入两个整数:
21 3
输入a: 21, b: 3
add is value:24
reduce is value:18
multipy is value:63
devide is value:7

GDB 调试步骤重点说明:

第一步:启动gdb 调试 myMathDemo 程序

1、首先确认Ubuntu 已经安装gdb,否则执行如下命令:
sudo apt-get install gdb

2、创建调试可执行文件
gcc myMathDemo.c -g -o myMathDemo -L. -lmyMath     //基于自定义函数文件, 添加调试参数 -g

3、启动GDB, 调试可执行文件 myMathDemo
gdb ./myMathDemo

第二步:设置断点

 break 6  //基于代码行号设置断点

第三步:运行至指定断点

 run

第四步:执行单步调试

 next

第五步:输出变量值

 print a
 print b 

第六步:程序继续执行

 continue

第七步:退出

q

常见指令说明:

  • next:执行下一行代码。

  • step:单步执行,如果遇到函数调用会进入该函数内部。

  • print <variable>:打印变量的值。

  • continue:继续程序的执行。

  • backtrace:显示当前函数调用栈。

GDB 调试程序控制台命令输出

wz2012@LAPTOP-8R0KHL88:/mnt/e/ubuntu_code$ gcc myMathDemo.c -g -o myMathDemo -L. -lmyMath
wz2012@LAPTOP-8R0KHL88:/mnt/e/ubuntu_code$ gdb ./myMathDemo
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04.1) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
--Type <RET> for more, q to quit, c to continue without paging--
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./myMathDemo...
(gdb) break 6
Breakpoint 1 at 0x11c4: file myMathDemo.c, line 6.
(gdb) run
Starting program: /mnt/e/ubuntu_code/myMathDemo
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main () at myMathDemo.c:6
6           printf("请输入两个整数:\n");
(gdb) print a
$1 = 4096
(gdb) print b
$2 = 0
(gdb) next
请输入两个整数:
7           scanf("%d%d", &a, &b);
(gdb) next
21 3
8           printf("输入a: %d, b: %d\n", a, b);
(gdb) print a
$3 = 21
(gdb) print b
$4 = 3
(gdb) backtrace
#0  main () at myMathDemo.c:8
(gdb) continue
Continuing.
输入a: 21, b: 3
add is value:24
reduce is value:18
multipy is value:63
devide is value:7
[Inferior 1 (process 11204) exited normally]
(gdb) q

GDB使用手册

启动 GDB

要启动 GDB 并调试一个程序,可以使用以下命令:

gdb program_name

这将启动 GDB 并加载 program_name 程序,准备开始调试。

基本命令

  • run:运行程序。
  • break file_name:line_number:在指定文件和行设置断点。
  • break function_name:在指定函数设置断点。
  • continue:继续程序执行。
  • next:单步执行下一行代码。
  • step:单步进入函数调用。
  • print variable_name:输出变量的值。
  • quit:退出 GDB。

查看信息

  • bt:打印函数调用栈。
  • info locals:显示当前栈帧的本地变量。
  • info breakpoints:显示所有断点信息。
  • info registers:显示寄存器内容。

调试技巧

  • 在 GDB 中可以输入表达式进行计算,例如 print 5 + 3
  • 使用 display expression 命令可以持续显示表达式的值。
  • 使用 info breakpoints 命令可以查看当前设置的所有断点。
  • 使用 record 和 reverse-stepreverse-continue 等命令进行逆向调试。

源码与汇编码

  • layout src:显示源代码窗口。
  • layout asm:显示汇编码窗口。
  • layout regs:显示寄存器窗口。

调试程序运行中的问题

  • 在程序运行中遇到问题时,可以随时中断程序执行,使用 Ctrl+C 来中断程序,然后可以使用 GDB 进行调试。

退出 GDB

要退出 GDB,可以使用 quit 命令。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值