1.程序的发布方式有两种,debug模式和release模式,Linux默认是release模式,VS模式是debug模式。
2.Linux gcc/g++出来的二进制程序,默认是release模式
3.要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项
1.使用gdb
1.1 gdb了解及准备
开始调试 gdb binFile
退出:ctrl + d 或 quit
首先我们写出一段简单的C语言程序
#include <stdio.h>int main(){
int i = 0;
for(i = 0;i<10;++i)
{
printf("%d ",i);
}
printf("\n");
return 0;
}
![[ Linux ] Linux调试器--gdb使用_linux](http://img.558idc.com/uploadfile/allimg/centos/236a55486e5d0e13018090b2279760de7342aa.gif)
![[ Linux ] Linux调试器--gdb使用_linux_02](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0ad6ca90707.png)
![[ Linux ] Linux调试器--gdb使用_linux_03](http://img.558idc.com/uploadfile/allimg/centos/f812e994791df0d50ae86840ab9097d294fc00.gif)
开始调试:注意:默认形成的可执行程序,无法调试!!
因为Linux下默认的版本是release,我们都知道要调试必须在debug版本下
系统当中有一条命令 可以以断的形式能够把结构信息显示出来
readelf -S test![[ Linux ] Linux调试器--gdb使用_linux_04](http://img.558idc.com/uploadfile/allimg/centos/33cbfaa951ec2e9c92d723699f7f10740e4599.gif)
![[ Linux ] Linux调试器--gdb使用_可执行程序_05](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0a70d385993.png)
![[ Linux ] Linux调试器--gdb使用_函数调用_06](http://img.558idc.com/uploadfile/allimg/centos/14588a36374e8386a9f553b478b8e55ef847ea.gif)
![[ Linux ] Linux调试器--gdb使用_linux_07](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0abe1e61362.png)
![[ Linux ] Linux调试器--gdb使用_linux_08](http://img.558idc.com/uploadfile/allimg/centos/d2d13e270cec2ac7b1f92885b3035098448044.gif)
如何生成debug版本的可执行程序呢?可以使用下面这条命令
gcc test.c -o test_g -g![[ Linux ] Linux调试器--gdb使用_函数调用_09](http://img.558idc.com/uploadfile/allimg/centos/22c6e4605247dc0beb943512182ecdc95d8676.gif)
注意:所有的调试代码操作必须在debug版本下执行
我们发现debug版本的体积明显大于release版本下的体积,大的这部分正式调试信息
![[ Linux ] Linux调试器--gdb使用_linux_10](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0c230336822.png)
![[ Linux ] Linux调试器--gdb使用_函数调用_11](http://img.558idc.com/uploadfile/allimg/centos/13ebb0b1688f9d098ff32703a73b22de14fc0b.gif)
我们使用这条指令可以查看调试信息:
readelf -S test_g | grep debug![[ Linux ] Linux调试器--gdb使用_可执行程序_12](http://img.558idc.com/uploadfile/allimg/centos/01939bb5472d6bdf712263a4d5493af7757076.gif)
![[ Linux ] Linux调试器--gdb使用_函数调用_13](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc09f08177673.png)
![[ Linux ] Linux调试器--gdb使用_可执行程序_14](http://img.558idc.com/uploadfile/allimg/centos/a399f5a452134cbbc547973bf06b91795a0b1f.gif)
2.使用gdb
2.1 进入gdb
gdb test_g![[ Linux ] Linux调试器--gdb使用_linux_15](http://img.558idc.com/uploadfile/allimg/centos/c42fd6f49d173b8f293987741a7dc4b54bf9f3.gif)
![[ Linux ] Linux调试器--gdb使用_linux_16](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0c4a6e14918.png)
![[ Linux ] Linux调试器--gdb使用_可执行程序_17](http://img.558idc.com/uploadfile/allimg/centos/c5a08992838353fe01d546f6fd22a10c5b63f1.gif)
注意:这里要进入的是test_g
2.2 显示源代码
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
listlist 0
![[ Linux ] Linux调试器--gdb使用_可执行程序_18](http://img.558idc.com/uploadfile/allimg/centos/3594537550a252359190261f01dc225649b0ba.gif)
![[ Linux ] Linux调试器--gdb使用_可执行程序_19](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0ba28140015.png)
![[ Linux ] Linux调试器--gdb使用_linux_20](http://img.558idc.com/uploadfile/allimg/centos/a3d4108997949851b732509acf0dd77d5ed304.gif)
![[ Linux ] Linux调试器--gdb使用_可执行程序_21](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0a0d4e33246.png)
![[ Linux ] Linux调试器--gdb使用_函数调用_22](http://img.558idc.com/uploadfile/allimg/centos/95562992894cd13030a8090f9a33a6c3d3072f.gif)
2.3 打断点 查看断点信息
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
b 行号![[ Linux ] Linux调试器--gdb使用_可执行程序_23](http://img.558idc.com/uploadfile/allimg/centos/8572497002b2b3ec72729122b04bc37c33a7db.gif)
![[ Linux ] Linux调试器--gdb使用_函数调用_24](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0a0d8680956.png)
![[ Linux ] Linux调试器--gdb使用_可执行程序_25](http://img.558idc.com/uploadfile/allimg/centos/16c3c6950ad880d6a8e7694e24d32cd0af27d1.gif)
info b :查看断点信息。
![[ Linux ] Linux调试器--gdb使用_linux_26](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0b251661462.png)
![[ Linux ] Linux调试器--gdb使用_可执行程序_27](http://img.558idc.com/uploadfile/allimg/centos/73ac7c593aad4828792009b10cd4476732c03c.gif)
2.4 运行程序
r或run:运行程序
![[ Linux ] Linux调试器--gdb使用_可执行程序_28](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0c2efd73549.png)
![[ Linux ] Linux调试器--gdb使用_函数调用_29](http://img.558idc.com/uploadfile/allimg/centos/55dee5c98947186a4b3801f5ef8eddc79bdf51.gif)
2.5 查看变量信息
print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
p &变量:打印变量地址
![[ Linux ] Linux调试器--gdb使用_linux_30](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0ad4f598455.png)
![[ Linux ] Linux调试器--gdb使用_可执行程序_31](http://img.558idc.com/uploadfile/allimg/centos/b4152044856094c11be7561161b6e485c86971.gif)
2.6 逐语句执行
s或step:进入函数调用
s![[ Linux ] Linux调试器--gdb使用_函数调用_32](http://img.558idc.com/uploadfile/allimg/centos/068140b661d275589432745aa9916577bea624.gif)
![[ Linux ] Linux调试器--gdb使用_可执行程序_33](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0e895127159.png)
![[ Linux ] Linux调试器--gdb使用_linux_34](http://img.558idc.com/uploadfile/allimg/centos/43e673963264aece1ca210f697072f178e66e0.gif)
2.7 逐过程执行
n 或 next:单条执行(不进入函数调用)
n![[ Linux ] Linux调试器--gdb使用_函数调用_35](http://img.558idc.com/uploadfile/allimg/centos/54bf1dd7931c08e1b7a97752e1a12a74a255b3.gif)
![[ Linux ] Linux调试器--gdb使用_可执行程序_36](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0b144596372.png)
![[ Linux ] Linux调试器--gdb使用_函数调用_37](http://img.558idc.com/uploadfile/allimg/centos/486217500eeb94dfaee321baa17f55da56f9c5.gif)
2.8 删除断点
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
d 断点num![[ Linux ] Linux调试器--gdb使用_函数调用_38](http://img.558idc.com/uploadfile/allimg/centos/336af30161b85befc984052dea8124dc1e3208.gif)
![[ Linux ] Linux调试器--gdb使用_可执行程序_39](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0a1f8e7233.png)
![[ Linux ] Linux调试器--gdb使用_函数调用_40](http://img.558idc.com/uploadfile/allimg/centos/a2cabad1268fe634012371d296d3fabe06620f.gif)
2.9 调用堆栈
breaktrace(或bt):查看各级函数调用及参数
bt![[ Linux ] Linux调试器--gdb使用_函数调用_41](http://img.558idc.com/uploadfile/allimg/centos/29cd75361591c9ce2e1445ba89b1474227dff4.gif)
![[ Linux ] Linux调试器--gdb使用_函数调用_42](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc09ed0645021.png)
![[ Linux ] Linux调试器--gdb使用_函数调用_43](http://img.558idc.com/uploadfile/allimg/centos/a4a3398254dcfdb670e2323cc93a939d4ac6d4.gif)
2.10 跟踪变量
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
![[ Linux ] Linux调试器--gdb使用_linux_44](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0c40d236097.png)
![[ Linux ] Linux调试器--gdb使用_函数调用_45](http://img.558idc.com/uploadfile/allimg/centos/69e0e7d2263ad84bc36196f7bd21145b537376.gif)
![[ Linux ] Linux调试器--gdb使用_linux_46](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0ae18c33250.png)
![[ Linux ] Linux调试器--gdb使用_可执行程序_47](http://img.558idc.com/uploadfile/allimg/centos/d6ec33a230175964d5b5572dd6fb8d53aa71e2.gif)
2.11 跳转至x行
until X行号:跳至X行
![[ Linux ] Linux调试器--gdb使用_linux_48](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0a8e8e92849.png)
![[ Linux ] Linux调试器--gdb使用_函数调用_49](http://img.558idc.com/uploadfile/allimg/centos/373eee7143628b8c848363cde50132f6783d8b.gif)
2.12 跳转至下一个断点
continue(或c):从当前位置开始连续而非单步执行程序
![[ Linux ] Linux调试器--gdb使用_linux_50](http://img.558idc.com/uploadfile/allimg/centos/06122952_6316ccc0ae98e86528.png)
![[ Linux ] Linux调试器--gdb使用_函数调用_51](http://img.558idc.com/uploadfile/allimg/centos/d8799f787862ba81e3e6284d94de49f7aa62e4.gif)
2.13 将一个指定函数跑完 finish
finish:执行完成一个函数就停止
(本篇完)
