Linux gcc gdb 编译调试程序

本文介绍Linux环境下使用gcc编译器进行程序编译的不同选项,并深入探讨gdb调试器的功能,包括设置断点、单步执行、查看变量值等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Linuxgccgdb程序调试用法
 
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八进制显示
二进制显示
a十六进制显示
c字符格式显示
浮点数格式显示
查看内存
x/<n/f/u><addr> //其中 n表示显示的第三个参数的个数, f格式见上面, u从当前地址往后请求的字节数,默认为 4b代表单字节, 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> // 信号量在 115
 
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号加以区分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值