您的位置:首页 > 运维架构 > Linux

Linux gcc gdb 编译调试程序

2016-03-18 12:34 489 查看
Linuxgcc和gdb程序调试用法 gcc一般调试格式:

gcc-Wall -o test test.c // -wall 显示程序错误详细信息 gcc-v //
显示gcc的版本gcc-o{1,2,3} test test.c // 1,2,3三个级别的优化,优化级别越高编译的时间越长gcc-ggdb3 -Wall -o test test.c //运用gdb可以跟踪调试程序,运行这命令gdb告诉gcc,使用gdb扩展产生调试,其中3表示使用的第三级调试信息,程序员可以获得更多的信息。如果程序有多个模块构成可以分别编译,然后再整体生成一个可执行的文件gcc-o test1.c //产生test1.ogcc-o test2.c //生成test2.ogcc-o test3.c //生成test3.ogcc-o program test1.c test2.o test3.o //生成program最终可执行文件关于gcc先这么多,以后用到,再补充。 www.2cto.com gdb符号调试器gdb主要提供以下功能:1.监视程序中变量的值得变化2.设置断点,使程序在指定的代码行上暂停执行,便于观察3.单步执行代码4.分析崩溃程序产生core文件 是首先 gcc-ggdb3 -Wall -o test test.c 调试程序./test 就是正常的执行程序如果出现了不正确的结果,再用gdb调试gdbtest出现(gdb)接口提示符run //开始运行程序,设置断点在开始运行之前,其他的命令都在运行程序下执行step| s //单步执行,遇见函数就进入函数next| n //单步执行,但不进入函数quit| q //退出gdb breakLineNumber| functionNamecontinue| cont N //
表示跳过的断点数tbreak LineNumber| functionName //
这只一个临时的断电,执行一次就自动删除enable/ disable 断点编号
//回复失效的断点|使有效的断点失效(如果操作多个断点,中间用空格分开)clear 断点的行号delete断点的编号
clear/delete都是清楚断点的,变量不一样啊watch 逻辑表达式 //此命令在程序run中运用,必须把main函数设置为断点,然后continue,程序停止在满足逻辑表达式地方。 查看栈的信息bt number //如果number>0 表示显示栈顶上number数栈的信息 //若果number<0 表示显示栈底上number数栈的信息 //省略则显示栈的全部信息frame| f n //
显示第n层栈的信息 栈顶是0,一次类推up<n> //
栈向上移n层 省略默认一层down<n> //
栈向下移nceng省略默认一层select-frame<n> == frame //只是不输出栈的信息up-silently<n> == up //只是不输出栈的信息 down-silently<n> == down //只是不输出栈的信息 infoargs //显示当前函数参数名及值infolocals //显示函数中所有局部变量infocatch //显示当先函数的异常处理信息 显示源代码list<function> //显示function函数的源程序list //
显示当前行前后各显示listsize/2行代码list- //
显示当前行 前面的代码list+ //
显示当前行 后面的代码setlistsize <number> //
设置一次显示源代码的行数showlistsize //查看listsize的数值list<first>,<last> //显示全部的源代码list ,<last> //
显示从当前行到last的源代码list <linenum> //
显示linenum行前后各显示listsize/2行代码 list<+ ffset> //
显示当前行的正偏移量list<- ffset> //显示当前行的负偏移量 搜索源代码forward-search<regexp> = search <regexp> //
向下搜索reverse-search<regexp> //
向上搜索directory<dirname:...> //
增加自定义文件搜索路径,多个路径用:隔开directory //
清除所有自定义源文件搜索路径信息showdirectories //显示自定义源文件的搜索路径 源代码的内存infoline 查看源代码在内存中的地址。infoline
后面可以跟“行号”、“函数名”、“文件名:行号”、“文件名:函数名”disassemble<> //
后面的参数加的和上面的一样,显示汇编代码 查看运行时的数据 print variable printfile::variable| function::variable//
如果查看的是全局变量的,为了防止和局部变量重名,可以加上通过这个形式说明print*array@len //显示动态数组print*array //
显示静态数组print /<f> <expr> //
格式输出数据输出格式如下:x十六进制显示d十进制显示u十六进制显示无符号整数o八进制显示t 二进制显示a十六进制显示c字符格式显示f 浮点数格式显示查看内存x/<n/f/u><addr> //其中n表示显示的第三个参数的个数,f格式见上面,u从当前地址往后请求的字节数,默认为4,b代表单字节,h代表双字节,w代表4字节,g表示8字节 自动显示display<expr> //只要变量有效的范围内都会显示undisplay| delete display <dnums...> //
删除编号为dnums的自动显示,同时删除好几个用空格隔开disabledisplay <dnums...> //
使编号为dnums的自动显示失效,多个的也是空格隔开enabledisplay <dnums...> //使编号为dnum的自动显示回复,多个也是用空格隔开infodisplay //
显示全部自动显示的信息 设置显示选项setprint address on //gdb一般会显示参数的地址信息,默认认为打开setprint address off //gdb一般不显示参数的地址信息showprint address //查看是否未打开setprint array on //
打开数组的每个元素占一行setprint array off //
关闭数组的每个元素以逗号隔开showprint array //查看是否打开setprint element <number-of-elements> //
显示数组最大的长度showprint elementsetprint null-stop <on/off> // 是否遇到结束符停止显示,默认是关闭的setprint pretyy on //
结构体显示比较漂亮showprint pretyy //
查看如何显示结构体setprint sevenbit-strings //
字符显示是否打开setprint union <on/off> //是指显示结构体时候是否显示其内的联合体数据showprint unionsetprint object <on/off>//在c++,当一个对象指向派生类,打开这个选项,gdb会自动按虚方法调用的规则显示setprint static-members <on/off> // C++对象中,是否显示其中静态数据成员,默认onshowprint static-memberssetprint vtbl <on/off> // gdb会比较规整格式显示虚函数,默认关闭showpritn vtbl 查看寄存器inforegisters //
查看寄存器的情况(除了浮点寄存器)infoall-registers //查看所有寄存器的情况(包括浮点寄存器)inforegisters <regname...> //查看制定寄存器的情况 gdb环境变量 //你可以环境调试中定义自己的变量,用来保存调试程序中的运行数据。set$var = exprshowconvenience //
查看当前设置的所有环境变量ex> set $i=0printbar[$i++] -> contents //
输入这样的命令后,只需按Enter,重复上一条语句,环境变量会自动累加 修改变量值print s = expr | set var s = expr //
最好使用后者 跳转执行 jump<linenumber> //跳转到linenumber行jump<address> //
跳转到地址为address处jump<+offse> //
向下跳offse行//使用jump命令最好在当前的函数的跳转,跨越函数跳转会发生错误 signal<singal> //
信号量在1到15 return return<expr>//强制返回,返回可以带返回值 call<func> //
强制调用函数 不同的语言使用gdb showlanguage //
查看当前的语言环境infoframe //
查看当前函数的程序语言infosource //
查看当前文件的程序语言setlanguage +语言名字
//手动设置语言
//c/c++/asm/fortran/java/modula-2/pascal/scheme coredump
分析 ulimit-c unlimited //
是自己拥有使用coredump
的权限gdbtest core+xxx //
系统防止本次生成core覆盖上次的,所有core后面加上pid号加以区分
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: