gdb操作简单版

CSAPP的前置gdb课程,学习一下基本操作

简介

1
2
3
4
5
6
7
8
9
10
#include <iostream>

int main(){
int j = 3;
int k = 7;

j +=k;
k = j*2;
std::cout<<"hello there"<<std::endl;
}

使用gdb时,我们需要在g++后面加上-g:

1
2
g++ -g -std=c++14 basic1.cc -o basic1
gdb ./basic1

Command

  • run

    运行程序

  • break

    break后面可以加行号,可以加函数名:

    在后面可以加条件 if condition

    1
    2
    break 7
    break main

    例子:

    1
    2
    3
    4
    5
    6
    7
    (gdb) break 7
    Breakpoint 1 at 0x40085c: file basic1.cc, line 7.
    (gdb) run
    Starting program: /home/hoshea/Desktop/gdb/basic1

    Breakpoint 1, main () at basic1.cc:7
    7 j +=k;
  • next

    运行下一行

  • list

    观察附近的代码

  • print

    打印需要的值

    1
    2
    print j
    print k+j
  • quit

    退出

  • up/down

    up 当前命令行/函数是谁在调用

    down就是往下

  • display/undisplay

    1
    display j

    每次运行都会显示j

  • backtrace

    查看目前的函数栈情况

  • step

    深入函数内部

  • continue

    到下一个断点

  • finish

    结束这个函数

  • watch x

    当x的值发生变化时,gdb会提示

  • info

    info 是一个常用的指令,用于获取程序执行状态的信息。info 指令后面可以跟随不同的参数,以获取不同类型的信息。

  • whatis

    whatis 是GDB用来判断变量的类型的。是相当好用的一个功能。

    1
    2
    3
    4
    5
    6
    7
    8
    (gdb) b main
    Breakpoint 12 at 0x403509: file src/core/nginx.c, line 201.
    (gdb) whatis main
    type = int (int, char * const *)
    (gdb) whatis 0x403509
    type = int
    (gdb) whatis (0x403509)
    type = int
  • target record-full

    反向调试

调试段错误

例子:

1
2
3
4
5
6
#include<stdio.h> 
#include<stdlib.h>
void main()
{
main();
}
1
2
3
4
5
6
7
8
9
10
11
$ gcc segfault.c -g -o segfault
$ ./segfault
Segmentation fault (core dumped)
$ gdb segfault
...
(gdb) run # 使用 run 命令运行后,会提示段错误出现在文件中的位置,如下所示
Starting program: /home/he/Desktop/GDB/segfault

Program received signal SIGSEGV, Segmentation fault.
main () at segfault.c:5
5 main();