Fortran第十四讲-GDB调试.ppt

上传人:小飞机 文档编号:6505894 上传时间:2023-11-07 格式:PPT 页数:31 大小:318.49KB
返回 下载 相关 举报
Fortran第十四讲-GDB调试.ppt_第1页
第1页 / 共31页
Fortran第十四讲-GDB调试.ppt_第2页
第2页 / 共31页
Fortran第十四讲-GDB调试.ppt_第3页
第3页 / 共31页
Fortran第十四讲-GDB调试.ppt_第4页
第4页 / 共31页
Fortran第十四讲-GDB调试.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《Fortran第十四讲-GDB调试.ppt》由会员分享,可在线阅读,更多相关《Fortran第十四讲-GDB调试.ppt(31页珍藏版)》请在三一办公上搜索。

1、,Fortran程序设计,第十四讲 习题课与GDB调试,复习第十三讲内容,旧版本的Fortran特性格式:1-5列是行号第一列是C或者星号,表示本行为注释第六列如果不是空白或0,表示续行,注释,有效语句位置,续行,旧版本,第一列用C或*,从第7列到72列,第6列非0为续行,Fortran90,!开始的行,从第1-132列,用&表示续行,行号,在1-5列,每行程序的最前面,DATA语句的使用变量初始化:DATA a,b,c/1.0,2*2.0/数组初始化:REAL a(2,2)DATA a/1.,2.,3.,4./!按列优先旧的PARAMETER 语句:INTEGER SIZEPARAMETER

2、(SIZE=1000),COMMON语句用BLOCK DATA初始化COMMON块中的数据BLOCK DATA initialINTEGER var1,var2COMMON/mydata/var1,var2DATA var1,var2/1,2/END BLOCK DATA,四条不必要的子程序特性另一子程序的返回点另一入口点语句函数将内置函数作为参数传递语句函数PAUSESTOPEND,PAUSE语句用于暂停程序的执行已经在Fortran95中被删掉,STOP语句用于终止程序的执行可以在STOP后面加参数,形式如下:STOP stop_value例如:STOP Normal completion

3、当终止时,会显示这个字符串,END语句在Fortran90之前,所有的程序单元都用END结束Fortran90以后,标准是用形如:END PROGRAMEND MODULE之类的语句当然,也可以单用END但是,内部过程和模块过程必须用END SUBROUTINE和END FUNCTION,算术IF语句GOTO语句计算GOTO语句赋值GOTO语句旧的DO循环与CONTINUE,多文件编译,14.1 迷宫的解法一,设置辅助数组的解法:设置三个和maze数组一样结构的数组:Step_maze 用于保存当前块在路径中的步数Leave_direction 用于保存在路径中离开当前块的方向,0表示东面,1

4、,2,3分别表示南西北From_direction 表示从哪个方向到达当前块,过程列表:Createmaze(maze,n)创建一个随机的二维方阵maze(n,n),方阵的元素要么是0要么是1,1表示迷宫的通道,0表示迷宫的墙Init_random_seed()初始化随机数种子Solve(maze,n)在迷宫maze(n,n)中找到一条从maze(1,1)到maze(n,n)的路径,如果找不到,输出提示信息,找到就输出路径步骤get_new_position(n,i,j,direction)在数组direction中取得i,j的方向,并计算这个方向所对应的新的i,j值check_directi

5、on(maze,n,i,j,direction,step_maze)检查迷宫的下一个方向能否走的通,14.2 迷宫的解法二,在这个算法中,不设置辅助数组用自定义的数据结构来保存在每个块上面的步数、方向等信息TYPE:maze_element INTEGER:road INTEGER:leave_direction INTEGER:from_direction INTEGER:step END TYPE maze_element,14.3 迷宫的递归解法,见代码,14.4 Fortran程序的调试,程序的调试程序没有语法错误,但是运行出错程序运行结果和预期不符程序运行结果的精度达不到要求调试的方

6、法:在程序中增加调试语句,来输出一些中间结果用调试软件图形化的调试软件命令行的调试软件,14.5 GDB的使用,如果需要调试程序,编译的时候添加-g选项gfortran g example.f90 o example生成的example.exe文件就是可执行文件此时,可以输入gdb example 进入调试程序,14.6 GDB 使用概述,GDB的命令可以输入help查看输入命令时,可以不用输入完整的命令,只需要前面几个字母,当然,这前面几个字母应该唯一区分了该命令输入一个或多个字母后,连按两次TAB键,可以列出所有以该字母打头的命令,14.7 在GDB中运行程序,rrun可以在gdb中运行程

7、序,14.8暂停与恢复程序运行,调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令。,14.8.1 设置断点,br

8、eakbreak break break.if.可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环体中,可以设置break if i=100,表示当i为100时停住程序。查看断点:info breakpoints ninfo break n,设置观察点,观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:watch 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。rwatch 当表达式(变量)expr被读时,停住程序。awatch 当表达式(变量)的值被读或被写时,停住

9、程序。info watchpoints 列出当前所设置了的所有观察点。,维护停止点,在GDB中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。clear 清除所有的已定义的停止点。clear 清除所有设置在函数上的停止点。clear 清除所有设置在指定行上的停止点。delete breakpoints range.删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。,比删除更好的一种方法是disable停止点,disable

10、了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。disable breakpoints range.disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.enable breakpoints range.enable所指定的停止点,breakpoints为停止点号。enable breakpoints once range.enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。enable breakpoints delete range.enable所指

11、定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。,为停止点设定运行命令,使用GDB提供的command命令来设置停止点的运行命令。也就是说,当运行的程序在被停止住时,我们可以让其自动运行一些别的命令。commands mand-list.end 为断点号bnum指写一个命令列表。当程序被该断点停住时,gdb会依次运行命令列表中的命令。例如:break foo if x0 commands printf x is%d/n,x continue end 断点设置在函数foo中,断点条件是x0,如果程序被断住后,也就是,一旦x的值在foo函数中大于0,GDB会自动打印出x的值,并继续运行

12、程序。如果你要清除断点上的命令序列,那么只要简单的执行一下commands命令,并直接在打个end就行了。,恢复程序运行和单步调试,当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。continue ignore-count c ignore-count fg ignore-count 恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示忽略其后的断点次数。continue,c,fg三个命令都是一样的意思。,step 单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被

13、编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。,next 同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。until 或 u 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。,14.9 查看栈信息,查看栈信息当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局

14、部变量都会被压入“栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。查看函数调用栈信息的GDB命令:backtrace bt,14.10 显示源代码,GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把源程序信息编译到执行文件中。不然就看不到源程序了。当程序停下来以后,GDB会报告程序停在了那个文件的第几行上。你可以用list命令来打印程序的源代码。list 显示程序第linenum行的周围的源程序。list 显示函数名为function的函数的源程序。list 显示当前行后面的源程序。list-显示当前行前面的源程序。,14.11 查看运行时数据,在

15、你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:print print/是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。,一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十六进制格式显示无符

16、号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。c 按字符格式显示变量。f 按浮点数格式显示变量。,14.11.1 自动显示,你可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的GDB命令是display。display display/expr是一个表达式,fmt表示显示的格式,当你用display设定好了一个或多个表达式后,只要你的程序被停下来,GDB会自动显示你所设置的这些表达式的值。,下面是一些和display相关的GDB命令:undisplay delete display 删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)disable display enable display disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。info display 查看display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否enable。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号