gdb 调试

gdb 调试

基本用法

  1. gcc -g xx.c xx
  2. gdb xx

基本命令

  1. start 启动程序, 默认停留在main程序的第一行
  2. run 启动程序, 程序默认运行无参数; 可以指定参数, 跟在sh中执行命令的方式一致, 文件重定向也可以; 如果不指定参数, 则使用上一次已经指定的参数; 也可以用set args arg1..argn指定参数; 清空参数set args
  3. list 缩写l, 查看程序源代码, 默认往下显示10行, list - 表示往上查看10行, list linenum 表示查看该行前后共10行代码, list function_name 表示查看该函数定义前后共10行代码, list filename: linenum, list filename: function 分别表示查看指定文件中的特定行或者特定函数, 上下共10 行代码
  4. break 缩写b, 设置断点 break filename:funcname:labelname:linenum, 一般使用b linenum或者b funcname; 可以增加条件断点, 在描述完断点后, 增加if expression 即可
  5. continue 缩写c, 表示继续执行程序下一个断点; 如果增加参数N, 如 continue N, 则表示执行到下一个断点, 并且该断点要触发了N-1次, 才会在该断点出停下, 否则继续向下执行
  6. print expression, 打印变量的值
  7. show option 查看gdb的配置
  8. info subcommand 查看正在被调试的程序的信息, 根据子命令来区分

多进程调试

  1. set detach-on-fork off, 默认该参数的值是on
  2. set follow-fork-mode, 可以选择fork后是在父进程还是子进程中停住
  3. info inferiors 查看当前有几个进程, 每个进程都会分配一个编号,用于在不同的进程之间切换调试
  4. inferior num 根据进程分配的编号, 来切换被调试的进程

参看 http://blog.csdn.net/pbymw8iwm/article/details/787679
PS:
1. 父进程的断点会被子进程继承, 因此, 可以先在父进程中打好断点, 然后切换到子进程后, 就可以用continue直接触发断点了
2. 在fork之后, 子进程默认会停留在fork.c的某一行, 需要continue, 子进程才会继续执行
3. 子进程的调试方法, 跟普通的进程调试方法类似

推荐

  1. 默认gdb查看源码很不方便, 不能轻松看出程序执行的位置, 建议安装cgdb, 基于curse和vim的gdb, 查看源码比较方便, 代码高亮显示, 执行多进程调试时, 显示不同的源文件和执行行

参考

  1. http://www.cnblogs.com/rosesmall/archive/2012/04/12/2444431.html