Gdb调试记录

GDB

[toc]

1.简介

GDB调试器 可以再运行程序的时候检查里面发生了什么

GDB可以做4件事:

  1. 开始并设置参数
  2. 打断点 再特殊情况下停止
  3. 当程序停止时,发生了什么
  4. 纠正错误的影响

GDB支持的语言:

  • Ada
  • Assembly
  • C
  • C++
  • D
  • Fortran
  • Go
  • Objective-C
  • OpenCL
  • Modula-2
  • Pascal
  • Rust

2.安装

1
2
3
yum install gdb #安装gdb

gdb --version #检测是否安装成功

3.开始

3.1 Demo程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

int main(){

    int arr[4] = {1,2,3,4};

    int i=0;
    for(i=0;i<4;i++)
    {
        printf("%d\n",arr[i]);
    }
    return 0;
}

3.2 gdb命令

利用gcc -g 带调试信息,否则无法调试。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
gdb a.out # 开始调试

run / r   # 运行程序

quit      # 结束

break / b # 断点 b 9 第9行设置断点 
          # 可以用b+行号 b+函数名打断点

next / n  # 继续执行

list / l  # 查看源代码

info b    # 查看断点情况

print /p  # 打印变量或地址

step / s  # 进入函数

4.gdb 技巧

  • gdb中可以通过shell xxx 去执行linux命令

  • 日志功能: set logging on

  • watchpoint(与print类似,可以观测变量的变化) 同样可以用info 查看watchpoint的情况

5.coredump调试

gdb 调试挂掉的程序

1
2
3
4
5
6
7
#include <stdio.h>

int main(){
	int* temp = NULL;
	*temp = 10;
	return 0;
}

shell的限制导致没能生成core文件 需要设置

如果没有core文件 需要设置ulimit限制

  • -a查看
  • -c unlimited 修改

设置后发现不能生成core文件,需要三部:

1
2
3
sudo apt install systemd-coredump
sudo su
sudo echo "core_%e_%p_%t" > /proc/sys/kernel/core_pattern

gdb 二进制文件 core文件

** 当需要定位位置时 可以使用where**

6.调试正在运行的程序

通过gdb -p PID调试正在运行的程序.注意./a.out & (后台运行)

updatedupdated2023-03-032023-03-03