• CS144官方给的教程:CS144 Debugging in GDB

  • 哪类程序可以被调试?

    【对于C程序来说,需要在编译时加上-g参数,保留调试信息,否则不能使用GDB进行调试】

    image-20230630160951363

常用的命令

  • 调试正在运行中的进程:先找到进程号pid,再gdb attach调试

    image-20230630161440540
  • 比断点更为简便的方法:until

    1
    2
    (gdb) until n	n为要停止的行号
    (gdb) u n
  • 设置断点

    • 下面分别是根据函数名、行号、文件名+行号设置断点

      1
      2
      3
      4
      5
      6
      7
      (gdb) break function
      (gdb) break line_number
      (gdb) break filename:line_number

      (gdb) b function
      (gdb) b line_number
      (gdb) b filename:line_number
    • 在异常处设置断点:

      有时程序中有未捕获的异常会导致程序异常的行为甚至导致程序的直接退出。 这对服务器程序来说是不可接受的。可以使用gdb的catch命令来帮助我们调试异常。

      使用gdb捕获异常的扔出点(相当于在扔出异常的地方添加断点):

      catch throw

      使用gdb捕获线程退出(相当于在线程退出的时候添加断点):

      catch pthread_exit

      这样,如果相应的事件发生,gdb就会中断程序的执行, 就可以使用gdb的bt命令来检查出现错误的调用栈了。

    删除断点

    1
    2
    3
    (gdb) delete break		删除所有断点
    (gdb) delete break n 删除某个断点 n为断点号
    (gdb) clear n 删除某个断点 n为行号 删除该行的断点

    查看断点信息

    1
    (gdb) info break

    禁用/启用断点

    1
    2
    3
    (gdb) disable break n  	禁用某个断点 n为断点号

    (gdb) enable break n 启用某个断点 n为断点号

    从断点处继续执行

    1
    2
    (gdb) continue
    (gdb) c
  • 开始运行

    To run the program, just type run followed by any command line arguments. Anything output to STDOUT or STDERR will be output regularly.

    1
    (gdb) run -flag argument1 argument2
  • 观察变量的值:(参数 num 是查看或者修改的目标变量或者表达式)

    1
    2
    (gdb) print num
    (gdb) p num

    观察别的信息

    1
    2
    3
    4
    (gdb) info locals				打印出当前函数中所有局部变量及其值。
    (gdb) info args 打印出当前函数的参数名及其值。
    (gdb) info catch 打印出当前的函数中的异常处理信息。
    (gdb) info frame/info f 打印出更为详细的当前栈层的信息(大多数是地址)

    查看函数调用栈:【==查找出错位置时尤其好用==】

    1
    2
    (gdb) backtrace
    (gdb) bt
  • 向后执行(不进入被调用的函数):

    1
    2
    3
    (gdb) next
    (gdb) n
    (gdb) n 5 向下执行5条语句

    向后执行(进入被调用的函数):

    1
    2
    (gdb) step
    (gdb) s