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
相关推荐
.柒宇.17 分钟前
AI掘金头条项目部署实践指南
linux·运维·python·fastapi
budingxiaomoli18 分钟前
多机部署,负载均衡-LoadBalancer
运维·spring cloud·负载均衡
JesseDev1 小时前
Docker lnmp环境快速搭建开箱即用
运维·docker·容器
zhangrelay1 小时前
Ubuntu 18.04 经典 / 有趣 / 实用 APT 软件清单
linux·笔记·学习·ubuntu
金牛IT1 小时前
Gogs 轻量级 Git 服务器搭建与使用
运维·服务器·git
不做无法实现的梦~1 小时前
linux怎么使用正点原子无线dap烧录器
linux·运维·postgresql
coward911 小时前
Linux 内核 KGDB 以及内核驱动单串口调试笔记:telnet + agent-proxy + gdb-multiarch 实践
linux·单片机·嵌入式硬件
念一不念二1 小时前
VScode+云服务器
运维·服务器
vortex51 小时前
Kali Linux 磁盘扩容后内部分配完整教程
linux·运维
刻BITTER1 小时前
VirtualBox 安装Armbian x86 虚拟机
linux·嵌入式硬件