linux——编译链接和调试

学习linux——6

在linux系统上来编译c和c++通常会使用gcc和g++来进行编译链接。

gcc编译.c和.cpp的不同
指令含义
gcc -o mainc main.c编译main.c这个文件并将生成的文件命名为mainc
gcc -o mainc++ mainc++.cpp -lstdc++编译mainc++.cpp这个文件并将生成的文件命名为mainc++

在编译c++文件时,由于gcc默认只连接C语言的标准库,不会连接c++的标准库,因此需要在指令的后面加上 -lstdc++

在这里插入图片描述
如果cpp文件使用c文件的方式编译的话就会出错
在这里插入图片描述
但是如果使用g++来进行编译链接的话,因为g++里包含了c语音的标准库,所以可以直接进行编译链接

在这里插入图片描述

可执行文件的两种版本

一种是debug版本,即调试版本;另一种是release版本,即发行版本。
而我们通常需要对代码进行调试,所以一般都是debug版本。如果要生成debug版本需要在编译时加入 -g。

指令含义
gcc -c main.c -g
gcc -o main main.o
完成main的debug版本的编译链接
gcc -o main.c -g将以上两个步骤二合一,同样可以完成main的debug版本的编译链接

在这里插入图片描述
如果查看这个文件是否是debug版本呢

指令含义
readelf -S 文件名查看文件的中间文件ELF

在这里插入图片描述
可以看到这里多了debug的部分,这就完成了debug版本的文件的编译链接。

gdb调试

既然要进行调试,那么肯定需要在debug版本下进行。
在这里插入图片描述

就以上面那么mainc文件调试来说明一些gdb调试下的指令

指令含义
q退出调试
list 或者 l默认显示mainc文件的源码
l filename:行号查看文件行号的源码

在这里插入图片描述

查看信息
指令含义
info b查看断点信息
info display查看所有的变量信息
断点管理
添加断点:
指令含义
b 行号给指定的行号添加断点
b 函数名给指定的函数实现的第一行添加一个断点
b filename:行号给指定的文件的行号添加一个断点

在这里插入图片描述

删除断点:
指令含义
d 断点号删除指定的断点

在这里插入图片描述

运行管理:
指令含义
r启动执行,程序会运行到逻辑上的第一个断点处
n逐过程执行
s逐语句执行
finish跳出当前函数
c继续执行,直到到达下一个断点处,若没有下一个断点,则运行到结束
u退出循环
显示变量的值:
指令含义
p 变量名输入一次,显示一次
display 变量名在执行过程中,每执行一步,显示一次
undisplay 变量的编号取消一个变量显示
p &valname显示变量的地址
p ptr显示ptr指针指向的变量的值
p arr显示数组中所有元素的值
p *arr@数组大小此处是arr作为函数参数时,显示数组中所有元素的值
p node显示结构体变量中所有成员的值
p node.a显示结构体变量中a成员的值
p 函数名(传递的实参)显示函数的返回值,可以用于测试函数能否正常执行
bt显示函数的调用栈
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值