Linux调试器gdb的使用

时间:2022-07-10 16:41:17

背景

  • 程序发布有两个版本,Debug模式和Release模式

  • Linux下gcc/g++出来的二进制程序默认是release模式

  • 要使用gdb调试,必须在源代码生成二进制程序时加上 -g 选项(如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址)

gdb功能

gdb可实现以下四个功能:

  1. 启动程序,自定义运行

  2. 设置断点

  3. 当程序停止可检查程序发生的事

  4. 动态改变程序执行环境

调试实例

main.c

#include <stdio.h>

int Add(int a, int b){
    return a + b;
}

int main(){
    int result = Add(2, 3);
    int i = 1;
    int sum = 0;
    for(; i < 10; ++i){
        sum += i;
    }
    printf("sum = %d\n", sum);
    printf("result = %d\n, result); printf("Hello World!\n"); printf("^_^嘻嘻嘻\n"); return 0; }

调试过程:

Linux调试器gdb的使用
Linux调试器gdb的使用
Linux调试器gdb的使用

常用指令

  • list(l)行号:显示某行源代码,每次列十行(上5行下5行)

  • list(l) 函数名:列出某函数源代码(上2行下8行)

  • break(b) 行号:在某一行设置断点

  • break(b) 函数名:在某个函数开头设置断点

  • info break:查看断点信息

  • info(i) breakpoints:查看当前设置了哪些断点

  • delete(del) breakpoints:删除所有断点

  • delete(del) breakpoints n:删除序号为n的断点

  • disable breakpoints:禁用断点

  • enable breakpoints:启用断点

  • run(r):运行程序

  • next(n):单条执行

  • step(s):进入函数调用

  • continue(c):继续执行,非单步执行

  • p 变量:打印变量值

  • breaktrace(bt):查看函数堆栈

  • frame 0:查看栈顶

  • frame 1:查看第二层栈

  • disassemble 函数名:查看函数汇编

  • quit(q):退出gdb调试

数据输出格式

  • x 按十六进制格式显示变量。
  • d 按十进制格式显示变量。
  • u 按十六进制格式显示无符号整型。
  • o 按八进制格式显示变量。
  • t 按二进制格式显示变量。
  • a 按十六进制格式显示变量。
  • c 按字符格式显示变量。
  • f 按浮点数格式显示变量。

    如:
    p i (按十进制格式打印变量i)
    p/x i (按十六进制格式打印变量i)