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.o gcc-o test2.c //生成 test2.o gcc-o test3.c //生成 test3.o gcc-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| functionName continue| 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 element setprint null-stop <on/off> // 是否遇到结束符停止显示,默认是关闭的 setprint pretyy on // 结构体显示比较漂亮 showprint pretyy // 查看如何显示结构体 setprint sevenbit-strings // 字符显示是否打开 setprint union <on/off> //是指显示结构体时候是否显示其内的联合体数据 showprint union setprint object <on/off>//在 c++,当一个对象指向派生类,打开这个选项, gdb会自动按虚方法调用的规则显示 setprint static-members <on/off> // C++对象中,是否显示其中静态数据成员,默认 on showprint static-members setprint vtbl <on/off> // gdb会比较规整格式显示虚函数,默认关闭 showpritn vtbl 查看寄存器 inforegisters // 查看寄存器的情况(除了浮点寄存器) infoall-registers //查看所有寄存器的情况(包括浮点寄存器) inforegisters <regname...> //查看制定寄存器的情况 gdb环境变量 //你可以环境调试中定义自己的变量,用来保存调试程序中的运行数据。 set$var = expr showconvenience // 查看当前设置的所有环境变量 ex> set $i=0 printbar[$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号加以区分