gdb调试常用命令

基本命令

1)进入GDB  #gdb test

test是要调试的程序,由gcc test.c -g -o test生成。进入后提示符变为(gdb) 。

2)查看源码  (gdb) l

源码会进行行号提示。

如果需要查看在其他文件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。或者:使用断点或单步运行,到某个函数处使用s进入这个函数。

3)设置断点  (gdb) b 6

这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。

4)查看断点处情况  (gdb) info b

可以键入"info b"来查看断点处情况,可以设置多个断点;

5)运行代码  (gdb) r

6)显示变量值  (gdb) p n

在程序暂停时,键入"p 变量名"(print)即可;

GDB在显示变量值时都会在对应值之前加上"N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"N",而无需写冗长的变量名;

7)观察变量  (gdb) watch n

在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;

8)单步运行  (gdb) n

9)程序继续运行  (gdb) c

使程序继续往下运行,直到再次遇到断点或程序结束;

10)退出GDB  (gdb) q

(gdb) break (b) 在源代码指定的某一行设置断点,其中xxx用于指定具体打断点位置

(gdb) run (r) 执行被调试的程序,其会自动在第一个断点处暂停执行。

(gdb) continue (c) 当程序在某一断点处停止后,用该指令可以继续执行,直至遇到断点或者程序结束。

(gdb) next (n) 令程序一行代码一行代码的执行。

(gdb) step(s) 如果有调用函数,进入调用的函数内部;否则,和 next 命令的功能一样。

(gdb) until (u)

(gdb) until (u) location 当你厌倦了在一个循环体内单步跟踪时,单纯使用 until 命令,可以运行 程序直到退出循环体。

until n 命令中,n 为某一行代码的行号,该命令会使程序运行至第 n 行代码处停止。

(gdb) print (p) 打印指定变量的值,其中 xxx 指的就是某一变量名。

(gdb) list (l) 显示源程序代码的内容,包括各行代码所在的行号。

(gdb) finish(fi) 结束当前正在执行的函数,并在跳出函数后暂停程序的执行。

(gdb) return(return) 结束当前调用函数并返回指定值,到上一层函数调用处停止程序执行。

(gdb) jump(j) 使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码。

(gdb) quit (q) 终止调试。

代码举例如下:

cpp 复制代码
$ ls
main.cpp
$ g++ -g -o test main.cpp
$ ls
main.cpp  test
$ gdb test         <-- 启动gdb进行调试
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-94.el7
Copyright (C) 2013 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/zhuyong/project/linux/blog/gdb/test...done.
(gdb)
cpp 复制代码
$ gdb test -q      <-- 启动gdb进行调试
Reading symbols from /home/zhudi/project/linux/blog/gdb/test...done.
(gdb) l            <-- 显示带行号的源代码
1	#include <iostream>
2	using namespace std;
3
4	int main() {
5	    int sum = 0;
6	    int n = 1;
7	    while (n <= 100) {
8	        sum += n;
9	        n++;
10	    }
(gdb)              <-- 默认情况下,l 选项只显示 10 行源代码,如果查看后续代码,按 Enter 回车键即可
11	    cout << "sum = " << sum << endl;
12
13	    return 0;
14	}
15
(gdb) b 7          <-- 在第7行源代码处打断点
Breakpoint 1 at 0x4008d3: file main.cpp, line 7.
(gdb) r            <-- 运行程序,遇到断点停止
Starting program: /home/zhudi/project/linux/blog/gdb/test

Breakpoint 1, main () at main.cpp:7
7	    while (n <= 100) {
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.x86_64 libgcc-4.8.5-39.el7.x86_64 libstdc++-4.8.5-39.el7.x86_64
(gdb) print n      <-- 查看代码中变量 n 的值
$1 = 1             <-- 当前 n 的值为 1,$1 表示该变量 表示该变量所在存储区的名称
(gdb) b 13
Breakpoint 2 at 0x40090e: file main.cpp, line 13.
(gdb) n            <-- 单步执行程序
8	        sum += n;
(gdb) n            <-- 单步执行程序
9	        n++;
(gdb) c            <-- 继续执行程序
Continuing.
sum = 5050

Breakpoint 2, main () at main.cpp:13
13	    return 0;
(gdb) print sum     <-- 查看 sum 的值    
$2 = 5050           <-- 当前 sum 的值为 5050
(gdb) q             <-- 退出调试
A debugging session is active.

	Inferior 1 [process 8449] will be killed.

Quit anyway? (y or n) y     <-- 确认是否退出调试,y 为退出,n 为不退出
相关推荐
人工智能训练25 分钟前
OpenEnler等Linux系统中安装git工具的方法
linux·运维·服务器·git·vscode·python·ubuntu
QT 小鲜肉1 小时前
【Linux命令大全】001.文件管理之which命令(实操篇)
linux·运维·服务器·前端·chrome·笔记
oMcLin2 小时前
Ubuntu 22.04 无法连接外部网络的故障排查与解决(解决 DNS 配置问题)
linux·网络·ubuntu
还不秃顶的计科生2 小时前
LeetCode 热题 100第二题:字母易位词分组python版本
linux·python·leetcode
咯哦哦哦哦2 小时前
WSL + ubantu22.04 + 远程桌面闪退+黑屏闪退解决
linux·开发语言
fantasy5_52 小时前
Linux 动态进度条实战:从零掌握开发工具与核心原理
linux·运维·服务器
weixin_462446233 小时前
exo + tinygrad:Linux 节点设备能力自动探测(NVIDIA / AMD / CPU 安全兜底)
linux·运维·python·安全
..过云雨3 小时前
17-2.【Linux系统编程】线程同步详解 - 条件变量的理解及应用
linux·c++·人工智能·后端
oMcLin3 小时前
CentOS 7 频繁出现 “Connection Refused” 错误的原因分析与解决
linux·运维·centos
饭九钦vlog4 小时前
银河麒麟修复openssh升级脚本
linux·运维