Linux下常用调试方法命令

GDB调试

  • 编译说明

    • 需要通过GDB进行调试的程序,在进行编译时需要指定 -g 选项
  • 启动参数

    • –directory: 指定调试时加载的源代码文件路径
      • 例如: gdb --directory /opt/nginx/src --args /opt/nginx/sbin/nginx -g "daemon off;"
    • –args: 后面直接跟 命令+参数,当再gdb中启动调试时,会以指定的参数启动程序
      • 例如: gdb --args /opt/nginx/sbin/nginx -g "daemon off;"
    • -x: 从指定文件中加载断点信息
  • 常用调试命令

    • info
      • info breakpoints —— 查看断点信息
      • info args —— 查看当前函数的参数
      • info locals —— 查看当前函数中的局部变量
      • info function 函数名 —— 进行函数查找,函数名支持通配符
      • info watch —— 查看所有的观察点
    • run(r): 重新开始运行程序
    • break(s): 断点
      • info breakpoints —— 查看所有断点信息
      • b 文件名:行号 —— 下断点到文件的指定行
        • 文件名可以省略,表示对针对当前文件下断点
        • 例如: b 100 b nginx.c:100
      • b 函数名 —— 对指定函数下断点
        • 例如: b main
      • delete breakpoints 数字 —— 删除第几个断点
      • save breakpoints aaa.txt —— 保存断点到指定文件,只能通过命令行参数从文件加载断点
    • continue(c) —— 继续运行,直到程序结束或者命中下一个断点
    • step(s) —— 单步调试(逐条语句执行,会进入函数内部)
    • next(n) ——单步调试(逐过程执行,不会进入函数内部)
    • backtrace(bt) —— 查看函数当前的栈帧和调用层级关系

    image-20220107220700654

    • frame(f) —— 栈帧操作

      • frame + 参数, 不指定参数则输出当前栈帧信息
      • 例如:移动到栈帧2,再打印对应的变量信息

      image-20220107204208438

    • print(p) —— 打印值或地址信息

    • watch(w) —— 设置观察点,被观察的变量发生修改时,打印显示

  • 多线程调试

    • thread:
      • thread apply all cmd: 所有线程中执行指定的GDB命令
        • 例如: thread apply all bt: 所有线程执行bt打印当前的调用栈
      • thread apply 线程ID cmd: 执行线程执行指定的GDB命令
  • 常用设置

    • set print elements 0: 打印字符串指针的所有内容,不进行截断
    • set scheduler-locking on: 只运行当前线程
    • set follow-fork-mode [parent|child]: 设置调试 [父进程|子进程]
    • show follow-fork-mode: 查看当前调试的父进程还是子进程
    • set detach-on-fork [on|off]: 设置调试当前进程时 [ 继续运行|挂起 ] 其他进程
    • show detach-on-fork [on|off]: 查看调试当前进程时继续运行还是挂起其他进程
    • set logging on 文件名: 将调试信息输出到指定文件
    • set pagination of: 关闭分页暂停的提示信息

strace

  • 说明
    • 跟踪程序或进程的系统调用
    • 当我们怀疑某个进程卡死或者跑飞的时候
    • 查看进程打开了哪些文件
    • 查看进程当前卡在哪个系统调用
    • ………….
  • 使用方法:
    • strace -p 进程号 —— 查看正在运行的进程的系统调用
    • strace 进程路径 —— 通过strace命令启动进程,查看进程的系统调用信息