linux中的大型程序报错,进行调试debug是一个浩大的工程,但是没有GUI界面进行断点调试,这对代码的优化十分不利。另外,有时候在Fortran程序中出现无缘无故的错误(例如全局变量无故变化,或者报错invalid memory reference),这涉及到内存占用的问题。这个问题是单纯依靠程序输出无法察觉到的。因此需要一个dubug工具:GDB。
安装命令:
$ sudo apt-get install gdb
使用/退出命令:
$ gfortran -g test.f -o a.out #-g选项是必要的,另外也可以加入-fbacktrace可以返回报错源程序位置,而不是返回报错的内存地址。
$ gdb a.out #进入gdb进行debug,然后就可以在gdb中对可执行文件进行debug了,注意gdb只针对可执行文件,不对源文件
$ quit #退处gdb,也可以只输入q
断点和监视点命令:
设置断点
$ break 130 #130行设置断点
$ break sum #给subroutine sum设置断点
$ tbreak 130 #130行设置临时断点,运后即删该断点
$ break 断点 if 条件
$ condition 断点编号 条件
查看断点编号
$ info breakpoints #显示所有断点和监视点
编辑断点
$ delete 10 #删除10号断点
$ clear sum #删除sum函数中的所有断点
$ disable 10 #禁用10号断点
$ enable 10 #启用10号断点
设置监视点
$ watch a #当a发生变化时暂停
$ rwatch a #当a被访问时暂停运行
$ awatch a #当a被访问或改变时暂停运行
继续运行
$ next #执行下一行,简称n
$ step #执行函数内部,简称p
$ continue #执行到下个断点,简称c
$ until #退出循环内的断点,直到循环结束
$ until 10 #跳过断点,一直运行到到第10行
$ ignore 2 3000 #跳过2号断点3000次再暂停
$ finish #执行到当前函数后暂停
显示命令:
$ print a #显示变量a的内容
$ list 100 200 #显示100-200行之间的源代码
$ backtrace 10 #显示开头10个栈的内容,简称bt
$ bt full 10 #显示开头10个栈的内容还有局部变量内容
$ x #显示内存内容
$ x/i $pc #显示汇编指令
$ x/10i $pc #显示从pc地址开始的10条指令内容
$ p $pc #显示程序指针内容
$ info registers #显示寄存器 简写info reg
$ info proc #显示当前进程信息
$ info funciton #显示函数
$ info locals #显示所有堆栈
将GDB附属在某个进程上
$ attach 107 #将GDB附着在107号进程中
调用函数
$ call sum(1,2) #调用sum函数
$ set $i=0 #设置参数i=0