GCC及GDB的使用
参考视频及博客
https://www.bilibili.com/video/BV1EK411g7Li/?spm_id_from=333.999.0.0&vd_source=b3723521e243814388688d813c9d475f
https://www.bilibili.com/video/BV1ei4y1V758/?buvid=XU932919AEC08339E30CE57D39A2BABF6A44F&from_spmid=search.search-result.0.0&is_story_h5=false&mid=rSmqqQLB5PQj7nof4wjfpQ%3D%3D&p=5&plat_id=114&share_from=ugc&share_medium=android&share_plat=android&share_session_id=0d47723b-d4d0-430f-9f99-3fbe1750ce7a&share_source=WEIXIN&share_tag=s_i&spmid=united.player-video-detail.0.0×tamp=1730192395&unique_k=9Cv4b9q&up_id=627875426&share_source=weixin
1.GDB的主要功能
开始并设置参数
打断点,在特殊情况下停止
停止时,发生了什么
GDB可以支持C, C++, Go, Pascal, 汇编语言等
2.安装GDB
安装:yum install gdb
查看版本:gdb -v
3.调试
调试的方式
gcc -g main.c
gdb ./a.out
程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>void func1()
{printf("func1-running\n");
}int main()
{int i;for(i = 0; i < 10; i++){printf("func-main-running-%d\n",i);sleep(1);}func1();return 0;
}
调试
命令:
run r 运行
break b 打断点b main //在函数main那一行打断点b 8 //在第8行打断点
list 展示代码
info b 显示断点信息
quit q 退出
next n 下一步
print p 打印 注意这里是print, 不是printf
step s 进入某个函数
r: 没有设置断点的时候,r会将程序运行完
list 展示代码
b 打断点
r 运行程序
n 下一步
print
q 退出
s 进入某个函数
4.watchpoint
4.1设置GDB中调用shell的命令:
例如:
shell ls
4.2日志功能
set logging on #会把output打印到gdb.txt中
4.3观察某个变量的值
print &point #打印指针point的值
print i #打印变量i的值watch &point #观察指针point的值,当point发生变化的时候,会打印出来
watch i #观察变量i的值,当i的值发生变化时,会打印出来 old value 和new value
按下n进入下一步,按下c进入下一步
5.当程序出现错误的时候,比如指针越界
会产生一个core文件
(假如程序出错的时候,没有产生core文件,就要通过ulimit来设置 ; ulimit -c unlimited)
./a.out #执行文件
出错,产生core
使用: gdb ./a.out core
执行完这一句话之后,会打印出错误的地址。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{int *p = NULL;*p =10;return 0;
}
su root之后重新查看
这里还是没出来core文件,后续再排查为什么
6.调试一个正在运行的进程。
gcc -g test_for.c
./a.out &
上边代码会返回进行的pid
gdb -p pid