gdb调试入门命令

一、-g

使用gdb调试,编译命令中要加入-g将调试信息加入可执行文件中

g++ -g -o A A.cpp

then $gdb\text{ A} $进入调试.

二、调试步骤(简单调试命令)

  1. run

    简写r,运行程序

  2. break

    简写b,设置断点,run可以停在断点位置,然后可以单步调试。断点可以设置在函数的位置或者某一行。

  3. next

    简写n,执行下一行,如果某一行为函数,不进入函数里。

  4. step

    简写s,下一步,会进入函数里取执行。

  5. list

    简写l,打印代码,默认10行

  6. print

    简写p ,打印某值

  7. display

    display j,展示j的值,每次单步调试会显示j的值

  8. undisplay

    undisplay,display会为变量分配一个id,undisplay id,不再展示变量的值

  9. finish

    调试函数时,finish可以跳过中间的执行步骤直接执行完函数,并打印最后函数的返回结果。然后停在那里。

  10. return

    调试函数时,return可以在中间位置直接return expression,跳过执行函数后面的步骤,直接返回表达式。

三、函数相关

  1. 列出函数的名字

    info functions可以列出可执行文件的所有函数名称。

  2. 是否进入带调试信息的函数

    step 进入,next不进入

  3. 进入不带调试信息的函数

    默认情况下,gdb不会进入不带调试信息的函数。set step-mode on命令,这样gdb就不会跳过没有调试信息的函数。

  4. 退出正在调试的函数

    finish or return,参见上述。

  5. 直接执行函数

    call or print命令。

  6. 打印函数堆栈帧信息

    info frame(i frame),i是info命令的缩写。

    info registers, 打印寄存器信息。

  7. 打印尾调用堆栈帧信息

    尾调用(Tail Call)是指一个函数在返回时直接调用另一个函数,并且调用的结果直接作为当前函数的返回值。这种调用方式可以通过编译器优化为尾调用优化(Tail Call Optimization, TCO),避免额外的栈帧分配,从而节省内存和提高性能。

    -O:优化,类似于O2,O3

    g++ -g -O -o tailcall tailcall.cpp
    
  8. 选择函数堆栈帧

    backtrace:显示到现在位置的堆栈帧信息。

    frame id

    frame addr

    id 选择的堆栈帧id,addr选择的函数堆栈帧地址。

  9. 向上或向下切换函数堆栈帧

    up n

    down n

    向上或向下选择函数堆栈帧。

    up-silently n

    down-silently n

    n省略则为1,下面的命令与上面的命令相比,切换后不会打印信息。