您好,欢迎访问三七文档
Linux培训课程目标学习使用字符界面gdb来调试Linux程序gdb高级应用图形gdb界面-dddLinux培训Gdb简介GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。GDB相对图形界面的VC++等,命令比较难记,这是命令行界面一大缺点Linux也有基于GDB图形界面的调试器,如gdbinsight,DDD.Linux培训GDB功能启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)当程序被停住时,可以检查此时你的程序中所发生的事。动态的改变你程序的执行环境Linux培训GDB与VC++调试命令的对比Linux培训GDB帮助象大多部复杂Linux程序一样,GDB是通过内部命令来完成调试工作gdb的命令很多,gdb把之分成许多个种类.help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用helpclass命令,如:helpbreakpoints,查看设置断点的所有命令。也可以直接helpcommand来查看命令的帮助。gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令在gdb下,你可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。Linux培训Linux培训GDB测试样例编译测试程序,一定要加上-g参数,为可执行文件加上调试信息–gcc-gtst.c-otst启动GDB的方式–gdbprogramprogram也就是你的执行文件,一般在当前目录下–gdbprogramcore用gdb同时调试一个运行程序和core文件,core是程序非法执行后coredump后产生的文件–gdbprogramPID如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。操作GDB常见命令Linux培训GDB的启动选项GDB启动时,可以加上一些GDB的启动选项–--symbolsfile–-sfile从指定文件中读取符号表。–-sefile从指定文件中读取符号表信息,并把他用在可执行文件中。–--corefile-cfile调试时coredump的core文件。–--directorydirectory-ddirectory加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。–fileprogram详细的开关可以用gdb--helpCompanynameLinux培训主讲人:曾健QQ:920086359Linux培训调试器的基本功能任何一种调试器,都必须具备如下基本功能–建立可执行程序与源码的联系(查看源码)–设置断点–执行行基本的调试命令–程序暂停后,查看各种信息Linux培训查看源程序GDB可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把源程序信息编译到执行文件中。当程序停下来以后,GDB会报告程序停在了那个文件的第几行上。你可以用list命令来打印程序的源代码。可以缩写为l–listlinenum显示程序第linenum行的周围的源程序。–listfunction显示函数名为function的函数的源程序。–list显示当前行后面的源程序。–list-显示当前行前面的源程序。一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。–setlistsizecount设置一次显示源代码的行数。setlistsize20设置显示一次20行–showlistsize查看当前listsize的设置。Linux培训查看源程序(2)list命令还有下面的用法–listfirst,last显示从first行到last行之间的源代码。–list,last显示从当前行到last行之间的源代码。–list+往后显示源代码。一般来说在list后面可以跟以下这们的参数:–linenum行号。–+offset当前行号的正偏移量。–-offset当前行号的负偏移量。–filename:linenum哪个文件的哪一行。lgdb_tst.c:20–function函数名。–filename:function哪个文件中的哪个函数lgdb_tst.c:main–*address程序运行时的语句在内存中的地址。l*0x0804835aLinux培训调试程序执行gdb–gdbgdb_tst设置断点–通常至少要设一个断点,要不然gdb会直接运行到程序结束.–bmain#在主函数入口设断点设置命令行参数–如果程序需要用到命令行参数,直接在gdb命令是无法输入–setargs可指定运行时参数。如:gdbsetargs1020304050开始调试–进入gdb提示符后,gdb并没有进调试状态–需要用r,即run进行调试Linux培训Linux培训在GDB中运行程序当以gdbprogram方式启动gdb后,gdb会在PATH路径和当前目录中搜索program的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。–程序运行参数。setargs可指定运行时参数。如:setargs1020304050–运行环境pathdir可设定程序的运行路径。showpaths查看程序的运行路径。setenvironmentvarname[=value]设置环境变量。如:setenvUSER=hchenshowenvironment[varname]查看环境变量。–工作目录。cddir相当于shell的cd命令。pwd显示当前的所在目录。–程序的输入输出infoterminal显示你程序用到的终端的模式。使用重定向控制程序输出。如:runoutfiletty命令可以指写输入输出的终端设备。如:tty/dev/ttybLinux培训常用调试命令当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。–continue[ignore-count]c[ignore-count]fg[ignore-count]恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示忽略其后的断点次数。continue,c,fg三个命令都是一样的意思。–stepcount单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的stepin。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。–nextcount同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step–setstep-modesetstep-modeon打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。Linux培训常用调试命令(2)–setstep-modoff关闭step-mode模式。–finish运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。相当于VC的stepout–until或u当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。untillinenum–stepi或sinexti或ni单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是“display/i$pc”,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)Linux培训查看运行数据GDB主要采用print来查看运行数据–printexpr#显示表达式值–print/f#f表示格式,如print/x按十六进制显示–printf“xis%d\n”,x#格式化输出GDB可以显示被调试程序的const常量、变量、函数,但不能显示宏内容GDB可以查看三种变量–全局变量(所有文件可见的)–静态全局变量(当前文件可见的)–局部变量(当前Scope可见的)–如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量–使用“::”操作符强制指定变量所在文件或函数,file::variable,function::variableLinux培训查看运行数据(2)print后接结构变量名,则可以把它所有成员打印出来查看数组–p*array@len#人为数组,查看内存中的连续对象–如果是静态数组,直接parrayprint输出格式–x按十六进制格式显示变量。–d按十进制格式显示变量。–u按十六进制格式显示无符号整型。–o按八进制格式显示变量。–t按二进制格式显示变量。–a按十六进制格式显示变量。p/ai–c按字符格式显示变量。p/ci–f按浮点数格式显示变量。Linux培训Linux培训print显示实例(gdb)pi–$21=101(gdb)p/ai–$22=0x65(gdb)p/ci–$23=101'e'(gdb)p/fi–$24=1.41531145e-43(gdb)p/xi–$25=0x65(gdb)p/ti–$26=1100101Linux培训查看内存使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示–x/n、f、u是可选的参数–n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。–f表示显示的格式,跟print的格式参数相同–u表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。–n/f/u三个参数可以一起使用x/3uh0x54320表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。Linux培训Linux培训查看栈信息当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。–backtracebt–backtracenbtnn是一个正整数,表示只打印栈顶上n层的栈信息。–backtrace-nbt-n-n表一个负整数,表示只打印栈底下n层的栈信息。Linux培训查看栈信息(2)如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。–framenfnn是一个从0开始的整数,是栈中的层编号。比如:frame0,表示栈顶,frame1,表示栈的第二层。–upn表示向栈的上面移动n层,并打印栈详细信息.可以不打n,表示向上移动一层。–downn表示向栈的下面移动n层,并打印栈详细信息,可以不打n,表示向下移动一层。
本文标题:GDB调试程序教程
链接地址:https://www.777doc.com/doc-4721611 .html