※进程
(1)默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB支持多进程的分别以及同时调试,也就是说,GDB可以同时调试多个程序。只需要设置follow-fork-mode和detach-on-fork即可。
*设置方法:a)启动gdb;b)set follow-fork-mode [parent|child] set detach-on-fork [on|off];c)启动程序文件;d)break fork 在fork函数处下断点。
(2)attach子进程的方法:用attach <pid>命令attach到子进程然后调试。步骤是:a)首先在需要调试的子进程的初始代码中加入一段特殊的代码,然后运行调试程序;b)用ps -ef | grep 查看产生的子进程的pid;c)启动gdb,attach到进程之后就可以调试了。
./test & 在后台执行程序
运行gdb
(gdb)attach <pid>
(gdb)stop 暂停子进程
*下断点后就可以开始调试了
※线程
*在多线程编程时,当我们需要调试时,有时需要控制某些线程停在断点,有些线程继续执行。有时需要控制线程的运行顺序。有时需要中断某个线程,切换到其他线程。这些都可以通过gdb实现。
gdb test
(gdb)l 1 显示代码
(gdb)r 5 r 16在第五行、第十六行下断点
(gdb)r 开始运行
(gdb)thread 3 切换到线程3
※gdb调试指令
*list linenum 显示程序第linenum行周围的程序
*list function 显示函数名为function的函数的源程序
*step count 一次性执行count步,如果有函数会进入函数
*next count 一次执行count步,有函数也不会进人
*finish 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值以及参数信息
*until 退出循环体
*watch expr 为表达式expr设置一个观察点,一旦表达式值有变化,马上停住程序
*rwatch expr 当表达式expr被读时,停住程序
*awatch expr 当表达式的值被读或被写时,停住程序
*info watchpoints 列出所有观察点