一、GDB概述
Linux下的GDB调试器,是一款GNU组织开发的UNIX/Linux下的程序调试工具,它没有图形化的友好界面,但功能强大。
二、准备工作
(a) 安装GDB: apt install gdb
(b) 创建main.cpp文件
vim使用技巧:在按esc进入命令模式下,在!后可直接输入命令行进行执行,还可以进行上下键查看历史命令。这样可以在不退出vim的情况下进行编译,从而及早发现问题。
三、GDB常用命令及调试实例
由于调试程序是个极为频繁的操作linux常用命令,所以GDB的所有命令,只要不出现冲突linux常用命令,都可以进行简写,如list可直接简写为l,break可直接简写为b。
为了方便调试,修改main.cpp如下:
(1) 编译成debug版
1.在ide工程选项里面配置release版本也生成调试信息,发布时,将pdb文件和exe文件一起发布。? 在vs中我们选择“菜单”-》工具-》选项,选项窗口中选择调试-》符号。galaxys3已经启动开发者选项,但是连接电脑之后手机提示连接为媒体设备,怎么进行usb调试and...……galaxys3已经启动开发者选项,但是连接电脑之后手机提示连接为媒体设备,怎么进行usb调试and...。
(2) 使用GDB对debug版本的可执行文件进行调试
执行 gdb main
【查看代码】
定位到crash函数,上文第一个红色行,然后根据偏移行定位到第三个红色行,向上查看定位到第二个红色行,最后定位到异常代码出现在gtg.cpp的第五行,哈哈一个简单的异常定位就结束了。内联函数应该是语句比较少、结构比较简单的函数,不应该是复杂的函数,因为它对编译器来说就是代码,如果很复杂会造成代码膨胀,反而增大开销,这种情况下其实多数编译器就都会自动把它作为普通函数来处理了。当应用程序运行时,windows会自动调用应用程序框架内部的winmain函数,并自动查找该应用程序类的全局变量theapp,然后自动调用用户应用程序类的虚函数initinstance,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作,如一个单文档应用程序的应用程序文件中的程序名.cpp中的initinstance()函数中的代码:。
【控制程序运行】
(2) break 行号 | 函数名<条件表达式> 设置断点
使用info break ,查看断点信息:
使用 delete (Num) ,删除断点:
(3) run 运行函数到断点处或者程序结束
(4) next 单步运行一条指令,不进入函数(把整个函数当成一行命令执行)
(5) step 单步运行一条指令,进入函数(真正的单条语句运行)
(6) continue 继续执行,直到遇到新断点或者程序结束
(7) watch 变量|表达式 观察变量或者表达式的值,只要其发生变化,则停止。
这个例子不是上述代码,反正比较简单,就是定义个 int i =0; 然后 i++;
【打印和设置内存变量】
为测试方便,修改代码如下:
(8) print 变量|表达式 查看当前指定变量或表达式的值
(9) set 变量名=新值 设置内存中指定变量的值,若出现不明确,需要加上var指明是程序中的变量
【查看程序调用栈】
为方便测试,修改main.cpp如下:
(10) backtrace当程序宕掉时,查看程序调用栈
所以说GDB是在Linux编程中必须使用的工具,没有GDB,在出现错误的时候很难想象错误发生在哪里。另外在Linux中也有这样的好处,就是当程序宕掉了基本不会对系统造成影响,而在windows中程序宕掉甚至会使系统产生异常,所以Linux是比较稳定可靠的,适合做服务器。
段错误调试:使用Core Dump查找程序宕掉的原因,可参考如下博客,讲得很详细:
https://www.cnblogs.com/lidabo/p/5014710.html