Gdb调试
注意:在Gcc编译选项中一定要加入
–g
退出GDB:quit
或
Ctrl+d
调试过程:
1
查看文件
命令:
(gdb)
l
命令:(gdb)
b
行号
注:到第17行停止,并没有执行17行
3
查看断点情况
info
b
4
运行代码
r
命令:
(gdb)
r
(也可以指定行开始运行,在r后面加上行号)
5
查看变量值
p
命令:(gdb)
p
变量名
6
设置监视点:
watch
z
(变量名)
也可以是复杂的表达式
7
单步运行
命令:(gdb)
n
(逐过程)
8逐步,会进入函数
命令:(gdb)
s
9条件断点
将正常断点转变为条件断点:condition
如:condition
1
i
==
10
只有当满足条件i
==
1时,才会在断点1处暂停
10
恢复程序运行
c
命令:
(gdb)
c
(程序就会运行,如果没有断点,就运行剩下部分,如果有断点,就会运行到下一个断点)
11
去除断点
clear
line_number
clear
filename:line_number
12
help
121
help找出类别
122help从列表中
follow-fork-mode
在2560版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。
follow-fork-mode的用法为:
set follow-fork-mode [parent|child]
parent: fork之后继续调试父进程,子进程不受影响。
child: fork之后调试子进程,父进程不受影响。
因此如果需要调试子进程,在启动gdb后:
(gdb) set follow-fork-mode child
并在子进程代码设置断点。
此外还有detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制:
set detach-on-fork [on|off]
on: 断开调试follow-fork-mode指定的进程。
off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。
注意,最好使用GDB 66或以上版本,如果你使用的是GDB64,就只有follow-fork-mode模式。
follow-fork-mode/detach-on-fork的使用还是比较简单的,但由于其系统内核/gdb版本限制,我们只能在符合要求的系统上才能使用。而且,由于follow-fork-mode的调试必然是从父进程开始的,对于fork多次,以至于出现孙进程或曾孙进程的系统,例如上图3进程系统,调试起来并不方便。
1、概念介绍。
1、Windows下的cmd就是Windows的命令行终端,其中的一些命令和Ubuntu的有些许区别,不过在这个博客的范畴中没有涉及。
2、Windows的环境变量,大概可以说是如果设置好了在path路径里面了,就可以直接在cmd命令行里直接调用程序。
2、配置 *** 作
1、选择计算机,右键,选择“属性”
2、“高级系统设置” –> “环境变量”
3、选择“环境变量”里面的“系统变量” ,选择path, 编辑
4、添加环境变量。注意:最好不要动原来的东西,在原来的东西的基础上在前面或后面加上一个分号,然后把Dev C++安装目录下的MinGW64/bin文件夹的路径复制到环境变量里面去。。(此处是巧借了dev的自带编译器,如果各位以其他方法找到了新版的MinGW文件的话,也可以配置成自己喜欢的)注意,路径中不要出现中文,否则可能出现有趣的问题
(ps:博主这边用的就不是dev 的MinGW64包了,而是师兄传下来的 :))
4、一路确定,配置完成。
3、使用 *** 作
在你代码所在的文件夹,按住shift加右键,点击“在此处打开命令窗口”,进入到cmd终端,接下来就可以愉快地使用g++,gcc编译器,和gdb调试器了。
4、后期优化
大家还可以给自己配一个用的顺手的编辑器,比如sublime,gvim,(甚至是notepad ,hhh)同理把它放在环境变量里,那么也可以在cmd中直接打开,这时在win下的编程过程就和Ubuntu的非常像了。。
5、备注
1、此处以win7为例,其他版本的应该大同小异。
2、另附片面的gdb调试方法
3、使用编辑器和命令行编译的方法对于了解程序的运行过程更加有好处,但是从方便性上的确不如IDE,特别是用熟了vs的同学们就应该更能体会得到,所以各有利弊,大家自己选择最符合自己口味的编程环境就好:)
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,基于命令行界面。
在Windows下如果想使用GDB,可以先下载安装一个MiniGW,这个工具包含GCC编译器和GDB调试器,再配合一个Notepad++或者Sublime Text(Sublime这款编辑器不是免费的,可以参考我前面写的一篇文章的破解方法来免费使用《Sublime Text 2在Linux和Windows下的破解》)来写代码,这样就足够了;
大多数Linux发行版都包含了GCC编辑器和GDB调试器,如果没有可以自行安装,这不是本文讨论论的重点,配合Vim或者Linux版本的Sublime Text来写代码也是不错的选择;
在大多数系统,gdb对使用fork创建的进程没有进行特别的支持。当父进程使用fork创建子进程,gdb仍然只会调试父进程,而子进程没有得到控制和调试。这个时候,如果你在子进程执行到的代码中设置了断点,那么当子进程执行到这个断点的时候,会产生一个SIGTRAP的信号,如果没有对此信号进行捕捉处理,就会按默认的处理方式处理——终止进程。 当然,你可以使用时间延迟的方法,在子进程fork出来之后,使用Sleep函数等待一段时间再运行,在这段时间中你使用ps找到该进程,然后使用Attach方法把该进程附加到gdb中,从而达到可以调试子进程的目的。
在一部分系统中(我使用的是基于26内核的CentOS,支持follow-fork和detach-on-fork模式),比如HP-UX11x之后的版本,Linux2560之后的版本,可以使用以下的方法来达到方便的进行多进程调试功能。
默认情况下,父进程fork一个子进程,gdb只会继续调试父进程而不会管子进程的运行。
如果你想跟踪子进程进行调试,可以使用set follow-fork-mode mode来设置fork跟随模式。
以上就是关于linux入门基础(四)Gdb调试程序全部的内容,包括:linux入门基础(四)Gdb调试程序、Linux:如何使用gdb调试多进程多线程程序、如何在Windows的命令行下进行程序编译和gdb调试等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)