gdb 调试
基本用法
- gcc -g xx.c xx
- gdb xx
基本命令
- start 启动程序, 默认停留在main程序的第一行
- run 启动程序, 程序默认运行无参数; 可以指定参数, 跟在sh中执行命令的方式一致, 文件重定向也可以; 如果不指定参数, 则使用上一次已经指定的参数; 也可以用set args arg1..argn指定参数; 清空参数set args
- list 缩写l, 查看程序源代码, 默认往下显示10行, list - 表示往上查看10行, list linenum 表示查看该行前后共10行代码, list function_name 表示查看该函数定义前后共10行代码, list filename: linenum, list filename: function 分别表示查看指定文件中的特定行或者特定函数, 上下共10 行代码
- break 缩写b, 设置断点 break filename:funcname:labelname:linenum, 一般使用b linenum或者b funcname; 可以增加条件断点, 在描述完断点后, 增加if expression 即可
- continue 缩写c, 表示继续执行程序下一个断点; 如果增加参数N, 如 continue N, 则表示执行到下一个断点, 并且该断点要触发了N-1次, 才会在该断点出停下, 否则继续向下执行
- print expression, 打印变量的值
- show option 查看gdb的配置
- info subcommand 查看正在被调试的程序的信息, 根据子命令来区分
多进程调试
- set detach-on-fork off, 默认该参数的值是on
- set follow-fork-mode, 可以选择fork后是在父进程还是子进程中停住
- info inferiors 查看当前有几个进程, 每个进程都会分配一个编号,用于在不同的进程之间切换调试
- inferior num 根据进程分配的编号, 来切换被调试的进程
参看 http://blog.csdn.net/pbymw8iwm/article/details/787679
PS:
1. 父进程的断点会被子进程继承, 因此, 可以先在父进程中打好断点, 然后切换到子进程后, 就可以用continue直接触发断点了
2. 在fork之后, 子进程默认会停留在fork.c的某一行, 需要continue, 子进程才会继续执行
3. 子进程的调试方法, 跟普通的进程调试方法类似
推荐
- 默认gdb查看源码很不方便, 不能轻松看出程序执行的位置, 建议安装cgdb, 基于curse和vim的gdb, 查看源码比较方便, 代码高亮显示, 执行多进程调试时, 显示不同的源文件和执行行
参考
聚沙成塔 滴水石穿
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)