目录
[(4)watch point设置](#(4)watch point设置)
(2)core文件不会默认生成,现在设置他生成,这个指令是基于终端的,终端重新打开要重新设置
[#!/bin/bash ./progA ./progB](#!/bin/bash ./progA ./progB)
一、下载
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.logstderr → stdout →
program.log👉 报错也进日志,不会丢
5️⃣
&后台运行(job control)
作用:
shell 把进程放到后台
你可以立刻继续敲命令
(3)调试程序
对于ubuntu22来说,需要sudo,不然不让弄
bash
sudo gdb -p 1138683
