GDB 入门笔记

72 阅读2分钟

GDB: The GNU Project Debugger

下载安装

快速开始

  1. C 程序代码示例

main.c

#include <stdio.h>

int main() {
    int sum = 0;
    for (int i = 0; i < 10; i++) {
        sum += i;
    }
    printf("sum=%d\n", sum);
    return 0;
}
  1. gcc 编译

gcc -g main.c -o main

注意:若想要使用 gdb 命令进行调试,编译时须加上 -g 参数开启 debug 模式;正常环境不要开启。

  1. gdb 调试

gdb main

l

打印出源码

b 4

在第4行打上断点

run

程序运行到第一个断点处

n

下一步

p sum

打印出 sum 的值

set var sum=10

对 sum 重新赋值

c

运行到下一个断点,若没有则运行到结束

q

退出 gdb

gdb 命令简介

  • run 可简写为 r : 开始运行
    • 一般都是作为第一个命令执行
  • list 可简写为 l : 打印源码
    • list + 行号/函数名 :打印对应行或对应函数的源码
  • breakpoint 可简写为 b
    • b + 行号/函数名 : 在某行或函数上打上断点
  • info b : 查看断点信息
  • delete 可简写为 d
    • d + 断点编号 : 删除断点(断点编号可使用 info b 查询)
    • d breakpoints : 删除所有断点
  • clear 行号:删除某行上的断点
  • disable b :所有断点失效
    • disable b + 断点编号 :断点失效
  • enable b :所有断点生效
    • enable b + 断点编号 :断点生效
  • next 可简写为 n : 下一步
  • step 可简写为 s : 下一步
  • continue 可简写为 c : 执行到下一个断点处
  • until + 行号 : 跳转到指定行数
  • print 可简写为 p
    • p + 变量名 :打印变量的值
  • display + 变量名 : 跟踪某个变量的值,每一步调试结束都会打印变量值
  • undisplay + 变量名编号 : 取消跟踪
  • set var + 变量名=xxx : 修改变量的值
  • call 函数(参数) :调用函数
  • finish : 执行到当前函数返回
  • q : 退出 gdb 模式

参考资料

备注

在macOSx环境允许时遇到两个问题:

  • Unable to find Mach task port for process-id 57186: (os/kern) failure (0x5).
    • 权限不够,需要执行 sudo gdb main 开启 debug
  • New Thread 0xd03 of process 1661 卡住
    • 需要先杀掉进程 ps -ef | grep gdb , sudo kill -9 xxx
    • 然后执行下述命令,参考自github
    • touch ~/.gdbinit
    • echo "set startup-with-shell off" >> ~/.gdbinit