用gdb调试单个程序,多线程,多进程
GDB调试程序
在linux中使用gdb调试时我们可以在编译的时候加上-g即可。如果你用一个makefile文件做处理,只需要在里面加上调试信息。gdb调试的是正在运行的程序,而不是我们已经编写好的.c文件。
如果我们没有添加-g,编译完成后我们可以用ls -l 来查看程序的大小,此时main的大小为5000
当我们加上调试信息-g后,我们再用ls -l 来查看main的大小,此时main的大小为6812。
这说明在main程序中,已经添加了我们的一些调试信息
在调试过程中,我们调试需要进行一些操作,以下为基本调试信息操作:
l(list):显示代码,通常我们每执行一次l操作,就会显示10行代码。如果想看某个函数的某一行,我们可以用l filename 10来操作,跳转函数的第10行代码
b(break):给代码加断点,比如:b 16,就是给第16行代码加断电
info break:这个命令可以查看我们都在哪些地方加了断点
r(run):执行程序
bt:函数调用栈关系
n:单目执行,往下走
s:进入函数
p d:打印出d所对应的值
finish:快速退出
c:一直往下走,知道遇到断点停止
q:退出调试
set var:修改变量的值
delete breakpoints:删除所有断点
多线程
在多线程环境下调试程序,我们首先在main函数中创建两个线程pthread_one,pthread_two
我们可以用ps aux|grep 'main’来查看当前运行的进程
pstree -p ID(进程ID),用来查看进程和线程之间的包含关系
gdb attach 3954(进程ID),这里显示我们创建了两个线程
info inferiors是查看进程,相对info thread是查看线程
bt查看线程结构
thread 1 切换到线程1,thread 2切换到线程2,以此类推
显示程序内容
给函数加断点
查看断点所在位置
cout,继续执行
多进程
首先写一个进程,然后让它fork出一个子进程:我们将打印出子进程的ID和子进程的父进程ID,同时睡眠一秒打印出父进程的ID和父进程的父进程ID(bash)
打印结果如下:
用show指令查看show follow-fork-mode[parent|child]和detach-on-fork[on|off]当前状态
用set指令将follow-fork-mode和detzch-on-fork选项设置为child和0
在fork出加断点B (行号),然后r运行值断点处,出入info inferiors查看程序中的多进程,gdb会默认赋予编号
此时*停留在num 3上,我们可以通过inferior +数字来切换进程
当我们调试到一半时想退出,输入q指令,此时系统会提示你是否要退出,我们输入y(yes)即可退出