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
相关推荐
可涵不会debug9 分钟前
C++ std::bind 实战教程:线程池、回调场景全覆盖
linux·开发语言·c++
实点科技24 分钟前
远程IO模块的柜外安装:装在什么位置、防尘罩怎么选配
运维·服务器·网络
云计算-Security28 分钟前
AI 赋能运维:UniRack 主机纳管平台的架构与实践
运维·人工智能·架构
青梅味猪大肠1 小时前
【操作系统-26】进程互斥软件实现-Peterson算法
linux·运维·服务器
分布式存储与RustFS1 小时前
在 Kubernetes 里跑对象存储的三个方案:Helm、Operator、以及什么时候别用 K8s
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
怪力左手1 小时前
docker+qemu创建镜像
运维·docker·容器
wdfk_prog1 小时前
Wi-Fi Direct教程 01:在 Ubuntu 搭建双 mac80211_hwsim + wpa_supplicant 2.12
linux·运维·服务器·ubuntu·ros·wifi-direct
fengkai45452 小时前
十一、MySQL 第 1‑3 章
运维·数据库·mysql
Vcaker2 小时前
Linux学习36-k8s集群升级及kube-vip高可用
linux·运维·学习
wdfk_prog3 小时前
Wi-Fi Direct教程 02:从 wpa_cli main() 到 P2P_FIND——用源码注释追踪 CLI 控制命令发送
运维·服务器·网络·网络协议·ubuntu·p2p·wifi-direct