学习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 | 显示函数的调用栈 |