gcc编译器以及gdb调试器

1.gcc是一个交叉平台编译器,在使用其编译的过程中,编译过程可以被细分为四个阶段:预处理、编译、汇编以及链接。
2.编译中的选项:
-g选项:在生成的可执行程序中包含标准调试信息
-Wall或者-Werror:在发生警告时取消编译操作,即将警告看作是错误
-o filename:指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果filename没有指定,缺省文件名为a.out
-I dir:在头文件的搜索路径列表中添加dir目录
-L dir :在库文件的搜索路径列表中添加dir目录
-O、-O2、-O3:将优化状态打开,该选项不能与-g选项联合使用
例如:gcc -O ineffecient_code.c -o ineffecient_code
-pedantic:严格要求符合ANSI标准
3.time ./程序名 用于计算程序的执行时间
4.gdb的使用:gdb或者gdb 可执行文件
相关命令:
file 装入想要调试的可执行文件
run 执行当前被调试的程序
kill 终止正在调试的程序
step 执行一行源代码而且进入函数内部
next 执行一行源代码但不进入函数内部
break 在代码里设置断点,这将使程序执行到这里时被挂起
print 打印表达式或变量的值,或打印内存中某个变量开始的一段连续区域的值,还可以用来对变量进行赋值
display 设置自动显示的表达式或变量,当程序停住或在单步跟踪时,这些变量会自动显示当前值
list 列出产生执行文件源代码的一部分
quit 退出gdb
watch 监视一个变量的值
backtrace 回溯跟踪
frame n 定位到发生错误的代码段,n为backtrace命令的输出结果中的行号
examine 查看内存地址中的值
jump 使程序跳转执行
signal 产生信号量
return 强制函数返回
call 强制调用函数
make 使用户不退出gdb就可以重新产生可执行文件
shell 使用户不离开gdb就执行Linux的shell命令
5.gdb的使用
在这里插入图片描述
在这里插入图片描述
6.break命令的用法
break <function>在进入指定函数时停住。C++可以使用class:function或function(type,type)格式来指定函数名
break<linenum> 在指定行号停住
break+offset 在当前行号的前面的offset行停住,offset为自然数
break-offset 在当前行号的后面的offset行停住
break filename:lineunm 在源文件filename的linenum行停住
break filename:function 在源文件filename的function函数的入口处停住
break *address 在程序运行的内存地址处停住
break 该命令没有参数时,表示在下一条指定处停住
break …if<condition> condition表示条件,在条件成立时停住。比如在循环体中,可以设置break if i=100,表示当i为100时停住程序
7.break和step的使用

8.查看运行时数据
**print命令:**在调试程序时,当程序被停住时,可以使用print命令(简写为p),或是同义命令inspect来查看当前程序的运行数据。
print命令的格式为:
print<expr>
print /<f><expr>
<expr>是表达式,是所调试程序的语言的表达式(gdb可以调试多种编程语言);<f>是输出的格式。比如,如果要把表达式按16进制的格式输出,那么就是/x
display:自动显示命令
可以设置一些自动现实的变量,当程序停住时,或是在单步跟踪时,这些变量会自动显示。
display<expr>
display / <fmt><expr>
display / <fmt> <addr>
fmt表示显示的格式,addr表示内存地址。
undisplay<dnums…>或者delete display<dnums>删除自动显示,dnums为已设置好的自动显示的编号。
disable display<dnums…>
enable display<dnums…>不删除自动显示的设置,而只是让其失效或恢复
info display 查看display设置的自动显示的信息。gdb会显示出一张表格,报告调试中设置了多少个自动显示设置。
9.查看源代码
显示源代码:gdb可以打印出所调试程序的源代码,当然需要在编译时加上-g参数,把源程序编译到执行文件中。当程序停下来以后,gdb会报告程序停在了程序的第几行上。可以用list命令来显示程序的源代码
list命令的相关参数:
list<linenum> 显示程序第linenum行的周围的源程序
list<function>显示函数名为function的函数的源程序
list 显示当前行后面的源程序
list- 显示当前行前面的源程序。一般是显示当前行的上5行和下5行,或者显示当前行的上2行和下8行,默认共显示10行
set listsize<count> 设置一次显示源代码的行数
show listsize 查看当前listsize的设置
list<first>,<last> 显示从first行到last行之间的源代码
list,<last> 显示从当前行到last行之间的源代码
list+ 向后显示源代码
查看源代码的内存
可以使用info line命令来查看源代码在内存中的地址。info line后面可以跟“行号”、“函数名”、“文件名:行号”、“文件名:函数名”的参数形式。
在这里插入图片描述
也可以使用disassemble来查看源程序的当前执行时的机器码。这个命令会把目前内存中的指令dump出来。
10.改变程序的执行
修改变量的值: print还有一个功能是修改被调试程序中运行时的变量值,比如 print x=8
跳转执行: gdb可以修改程序的执行顺序,可以让程序执行随意跳跃,功能由gdb的jump来实现。
jump<linespec>:指定下一条语句的运行点。<linespec>可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式,表示下一条运行语句从哪里开始
jump<address>
这里的<address>是代码行的内存地址
产生信号量:
使用signal命可以产生一个信号量给被调试的程序。如中断信号Ctrl+C。可以在程序运行的任意位置设置断点,并在该断点用gdb产生一个信号量。
signal<signal>
Linux的系统信号量通常从1到15
强制函数返回:
如果调试断点在某个函数中,还有语句没有执行完,可以使用return命令强制函数忽略还没有执行的语句并返回。
return<expression>
强制调用函数:
call <expr>
表达式中也可以是函数,以达到强制调用函数的目的,显示函数的返回值,如果函数返回值是void,那么就不显示。
print也可以完成这一功能。print后面可以跟表达式,所以也可以用来调用函数。print和call的不同之处是,如果函数返回void,call的不显示,print则显示函数的返回值,并把改值存入历史数据中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值