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
相关推荐
@zulnger2 小时前
数据提取_1
运维·服务器
shhpeng2 小时前
在 Ubuntu 24.04 上安装 Go1.24.2
linux·运维·ubuntu
颖风船2 小时前
vscode连接vmware中的deepin虚拟机,deepin端配置
linux·ide·vscode
苏宸啊2 小时前
Linux工具
linux
Vect__2 小时前
进程间通信之管道
linux
源远流长jerry2 小时前
DPDK 实现的轻量级 UDP 回显服务程序
linux·运维·服务器·网络·网络协议·ip
十六年开源服务商2 小时前
WordPress建站公司技术支持服务全解析
运维·数据分析
A-刘晨阳3 小时前
【Linux】Prometheus + Grafana的使用
linux·运维·grafana·prometheus·监控
Mr_Xuhhh3 小时前
字节跳动面经
linux·服务器