GDB在ubuntu上的安装与使用

目录

一、下载

二、快速使用

(1)示例代码

(2)使用gdb调试

(3)常用指令

[(4)watch point设置](#(4)watch point设置)

三、调试core文件

(1)代码示例

(2)core文件不会默认生成,现在设置他生成,这个指令是基于终端的,终端重新打开要重新设置

示例脚本

[#!/bin/bash ./progA ./progB](#!/bin/bash ./progA ./progB)

进程关系

四、调试正在运行的进程

(1)代码示例

(2)后台运行程序

(3)调试程序


一、下载

复制代码
sudo apt install gdb

下载成功如下可以查看版本

二、快速使用

(1)示例代码

cpp 复制代码
1	#include<stdio.h>
2	int main()
3	{
4		int arr[4] = {1,2,3,4};
5		int i = 0;
6		for(i = 0; i < 4; i++)
7		{
8			printf("%d\n", arr[i]);
9		}
10		return 0;

(2)使用gdb调试

必须使用-c编译,才可以使用gdb调试。

cpp 复制代码
gcc -g test.c

(3)常用指令

开始进入gdb调试

cpp 复制代码
gdb a.out 

运行程序 run

打断点指令break

可以选择要打断点的函数或者行。

查看当前代码list

查看当前断点info break

使用run运行到第一个断点停下来,使用continue运行到剩下的断点

使用next进入下一行代码

使用print打印变量数据,还可以查看地址

使用step进入函数调试

使用quit退出程序

gdb里面可以通过外加shell输入一些命令

(4)watch point设置

设置日志,会在同级文件夹生成gdb.txt文件,记录本次的所有操作

cpp 复制代码
set logging on

设置观察点,当观察点地址里面的值发生变化的的时候会打印出来。

三、调试core文件

(1)代码示例

这个内存区域操作系统不允许访问。所以回报错

cpp 复制代码
#include<stdio.h>
int main()
{
        int * temp = NULL;
        *temp  = 10;
        return 0;

}   

运行结果如下,他只给我报段错误,但是具体我不知道那一行代码出现了问题。

(2)core文件不会默认生成,现在设置他生成,这个指令是基于终端的,终端重新打开要重新设置

cpp 复制代码
ulimit -c unlimited

之后下载coredumpctl

cpp 复制代码
sudo apt install systemd-coredump

查看近期所有的core

cpp 复制代码
coredumpctl list

根据pid调试

cpp 复制代码
coredumpctl debug 12301

可以查看到错误所在的行

在很多的时候,我们是一个脚本运行好几个可执行文件的。

示例脚本

#!/bin/bash ./progA ./progB

进程关系

PID 1000 bash script.sh PID 1001 ├─ progA PID 1002 └─ progB

👉 一共 3 个 PID

所以每个可执行文件,包括脚本都有自己的pid,所以即使运行一个脚本,也可以在core文件中找到那个pid错误,从而定位那一段程序错误。

四、调试正在运行的进程

(1)代码示例

cpp 复制代码
#include<stdio.h>
int main()
{
	int i = 0;
	while(1)
	{
		i++;
		i = i %1000;
	//	printf("%d", i );
	}
	return 0;

}

(2)后台运行程序

cpp 复制代码
./a.out &

命令本身

nohup ./program > program.log 2>&1 &


一、整体在干什么(一句话)

program 在后台运行,
即使你关闭终端也不会被杀,
并且把所有输出都写到 program.log


二、逐段拆解(非常重要)

1️⃣ nohup

全称no hang up

作用:

  • 忽略 SIGHUP(挂断信号)

  • 终端关闭 / SSH 断开时:

    • 普通进程 → 收到 SIGHUP → 退出

    • nohup 启动的进程 → 继续运行

👉 这是"关终端不死"的关键


2️⃣ ./program

  • 你要运行的可执行文件

  • 当前目录下的 program


3️⃣ > program.log

重定向 stdout(标准输出)

等价于:

1> program.log

效果:

  • 程序原本 printf / cout 的内容

  • 不再打印到终端

  • 全部写进 program.log


4️⃣ 2>&1

重定向 stderr(标准错误)到 stdout 的去向

解释:

  • 2 = stderr

  • 1 = stdout

  • 2>&1 = "让错误输出和正常输出走同一条路"

现在:

  • stdout → program.log

  • stderr → stdout → program.log

👉 报错也进日志,不会丢


5️⃣ &

后台运行(job control)

作用:

  • shell 把进程放到后台

  • 你可以立刻继续敲命令

(3)调试程序

对于ubuntu22来说,需要sudo,不然不让弄

bash 复制代码
sudo gdb -p 1138683
相关推荐
chlk12315 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑16 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件16 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒17 小时前
OpenClaw 多 Agent 配置实战指南
运维
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行2 天前
Linux和window共享文件夹
linux
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux
蝎子莱莱爱打怪4 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes