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++

linux——编译链接和调试_第1张图片
如果cpp文件使用c文件的方式编译的话就会出错
linux——编译链接和调试_第2张图片
但是如果使用g++来进行编译链接的话,因为g++里包含了c语音的标准库,所以可以直接进行编译链接

linux——编译链接和调试_第3张图片

可执行文件的两种版本

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

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

linux——编译链接和调试_第4张图片
如果查看这个文件是否是debug版本呢

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

linux——编译链接和调试_第5张图片
可以看到这里多了debug的部分,这就完成了debug版本的文件的编译链接。

gdb调试

既然要进行调试,那么肯定需要在debug版本下进行。
linux——编译链接和调试_第6张图片

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

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

linux——编译链接和调试_第7张图片

查看信息

指令 含义
info b 查看断点信息
info display 查看所有的变量信息

断点管理

添加断点:
指令 含义
b 行号 给指定的行号添加断点
b 函数名 给指定的函数实现的第一行添加一个断点
b filename:行号 给指定的文件的行号添加一个断点

linux——编译链接和调试_第8张图片

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

linux——编译链接和调试_第9张图片

运行管理:
指令 含义
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 显示函数的调用栈

你可能感兴趣的:(Linux,linux)