今天开始学习在linux下面进行c++代码的调试方法的学习。使用GDB调试c++代码是unix环境c++编程的基本技能。对于长期在windows平台下面从事c++编程的程序员来说,在linux环境下面进行gdb调试确实有点难为人,但是gdb本身是一个功能强大的代码调试工具,只要多使用,熟悉了基本的命令使用方法和windows平台下IDE的调试相关功能有个很好的影射,那么在linux下面进行c++开发能力又将前进一大步。本文是我学习gdb调试工具的第一篇,先记录一些基本的gdb工具命令的使用,例如在gdb中查看源代码,运行程序,设置断点,查看变量值等等。后续还要学习多线程等条件下的调试技术,慢慢来,先从基础的开始。


前提

如果要使用gdb调试程序,在编译程序时需要加上-g选项,才能使用gdb工具调试。g++有关调试的选项有-g,-gstab,-gstab+,-ggdb,-glevel等,主要的作用就是告诉编译器在编译的时候尽量能生成调试信息,以便调试器获取调试信息。我们常用-g选项。此外,如果不加-g参数,当程序core掉时,使用gdb查看core文件是看不到core在哪一行代码的,只能知道core在那个函数调用,定位到函数。这也说明没加-g选项,缺少一些调试信息。在开发测试过程中,编译的时候加-g选项是一个不错的习惯,以便查找问题。关于core的问题实例看如下图:
下图是使用了-g选项编译的程序core掉后的gbd查看core的结果,现实哪一行出现的core

下图是没有使用-g选项编译的情况,当程序出现core,只能定位到函数:



常用的基本命令

当编译生成二进制文件以后,我们就可以使用gdb命令调试该程序了,使用如下命令启动调试:
gdb path/to/program
将出现如下提示:

输入命令l(list),将会列出程序的代码清单:(继续输入回车将会继续执行上次的命令(l命令)继续往下显示代码)

使用b(break)+代码行号 来设置断点。
使用r命令开始运行程序:(本程序为刚刚那个core的程序,直接结束了)


我们现在将断点设置到27行的core_foo()处,这样程序运行到该处时将停止,此时我们可以使用p命令查看变量的值:


whatis命令查看变量的类型



复杂结构变量的查看

在写程序的时候,变量的类型往往是比较复杂的类型,比如说stl的容器类,结构体,对象等等,gdb的p命令当然也支持这类变量的查看,但是使用起来有点不太方便,查看起来比较麻烦。例如:


上图中vec是一个vector<int>类型的变量,使用gdb的p命令显示不能直观的看到vec的元素的值。 http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt提供了在gdb中集成输出容器类的内容的命令,包括有pmap,pvector,plist等等。只需要将该文件中的代码拷贝进~/.gdbinit文件中即可,没有这个文件就新建一个,重新进入gdb就有了这些功能。下图为使用pvector显示的vector的内容:

同样,我们可以使用pmap查看map变量的内容,下图是查看map<string, int>类型变量的值的方法:(直接输入pmap命令会有使用方法提示,注意这里string使用char*代替才行,问题:如果string变成其他的自定义类呢?这种情况在自己试试应该怎么查看,应该和结构体的使用是类似的,直接使用声明的类名就行吧,猜测一下)

下面是list容器加结构体变量元素的变量查看:list的每个元素是一个结构体



今天就记录这些吧,接下来在学习一下更为复杂的调试场景的gdb使用。

一天学一点,每天进步一点^-^
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:23 天前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐