Linux下常用调试方法命令
GDB调试
编译说明
- 需要通过GDB进行调试的程序,在进行编译时需要指定
-g选项
- 需要通过GDB进行调试的程序,在进行编译时需要指定
启动参数
- –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: 从指定文件中加载断点信息
- –directory: 指定调试时加载的源代码文件路径
常用调试命令
- 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) —— 查看函数当前的栈帧和调用层级关系

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

print(p) —— 打印值或地址信息
watch(w) —— 设置观察点,被观察的变量发生修改时,打印显示
- info
多线程调试
- thread:
- thread apply all cmd: 所有线程中执行指定的GDB命令
- 例如: thread apply all bt: 所有线程执行bt打印当前的调用栈
- thread apply 线程ID cmd: 执行线程执行指定的GDB命令
- thread apply all cmd: 所有线程中执行指定的GDB命令
- thread:
常用设置
- 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命令启动进程,查看进程的系统调用信息