01.gbd调试总结
gbd调试总结
学习建议:
- 到官网上学习,否则掌握的信息就不是正规的信息,而是几手的信息;
- 系统化的学习,才能让你成长,碎片化的学习,只会让你焦虑;
- 借助于电子笔记软件(Notion)学习总结;
GDB
是什么东西?
一款优秀的调试助手!官网地址:gnu.org/software/gdb
gdb 搭建编程环境和安装方法?
yum install gdb
检查gdb是否成功安装?
gdb --version
QuickStart
测试程序代码:
// 程序名:test.c
#include<stdio.h>
void hello() {
printf("Hello ehco~~~\n");
}
int main() {
int arr[] = {1,2,3,4};
int i = 0; //记录i值变换
for(i =0; i < 4; i++)
printf("%d\n", a[i]);
hello();
return 0;
}
调试过程如下:
// step 1:
gcc -g test.c
// step 2:
gdb ./a.out
// step 3:
(gdb) run // 运行调试
// step 4:
(gdb) quit// 退出调试
//gdb 调试命令:
man gdb
// 断点调试 1:函数断点 2:行号断点
(gdb) main // 进入main()函数断点(函数名字)
(gdb) b 9 // 设置行号断点,查询源代码看看行号:break
(gdb) list // 查看程序代码
(gdb) info b // 查看断点信息
(gdb) n // next 单步调试
(gdb) p arr[0] // 打印变量信息:print var
(gdb) p &arr[0] // 打印变量地址信息: print &var
// gdb step (s) 用法
(gdb) b 10 // hello()函数所在的行号
(gdb) r
(gdb) s // step:进到->hello()函数内
(gdb) n // 单步执行:hello()函数代码
(gdb) n // 继续单步执行,运行致结束程序为止!
gdb 调试过程(以测试程序代码为例):
// step 1:
gdb ./a.out
// step 2:
(gdb) shell ls // 冠以shell配合,ls当前路径下文件
(gdb) shell cat test.c // 冠以shell配合,查看test.c代码
(gdb) set logging on // 将gdb调试过程记录到gdb.txt,保存在当前的文件路径下
// step 3: watchpoint
(gdb) b 8 // 设置i值所在的行号
(gdb) r // 运行run代码
(gdb) print &i // 打印i的地址,假设0x40000
(gdb) watch *0x40000 // 设置观察点地址
(gdb) info watchpoints // 查询观察点信息
(gdb) n
// 继续单步调试:重复此步
运行截图:
gdb小技巧总结:
- 冠以“
shell
” 可以去掉终端命令 - 日志功能:set logging on
- 观察功能:
watchpoint
查询变量新旧值是否改变 - checkpoint :
gdb 调试core文件方法:
gdb a.out core.4151.c
测试程序代码:test_error.c
#include<stdio.h>
int main() {
int *temp = NULL; // 空地址值
*temp = 10; // 往空地址值写入数值时,出错!
return 0;
}
调试过程如下:
// step 1: 编译文件
gcc -g test_error.c
// step 2: 运行二进制文件
a.out
// step 3: 运行报错:段错误
Segment fault
core文件不会默认生成,需要进行配置:
// step 1: 查询:
ulimit -a
// step 2: 查看:core size
core file size
// step 3: 配置参数:
ulimit -c unlimited
// step 4: 再次运行:a.out文件,会生成core.xxxxx文件
a.out
// step 5: 调试core文件:
gdb ./a.out core.xxxxxx
// step 6: 查看和分析报错文件结果
查看ulimit方法:man ulimit
附带->查询: ulimit -a 如下:
core file size (blocks, -c) 0 // 配置core file size
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7823
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7823
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
gdb调试进程方法:
测试程序代码:test_for,c
#include<stdio.h>
void test() {
}
void test1() {
int i = 0;
i++;
}
int main() {
for(;;) {
test();
test1();
}
return 0;
}
调试过程如下:
// step 1: 编译程序:
gcc -g test_for.c
// step 2: 后台运行
./a.out &
// step 3: 进程调试
gdb -p pid // p 所对应的ID
// step 4: 配合单步和step 打印变量信息
(gdb) n
(gdb) s
(gdb) p i
运行结果:
附加:查询进程:
ps -ef | grep a.out
运行结果:
gdb调试总结:
- gdb基本常用命令
- gdb调试多进程服务程序命令
- gdb调试多线程服务程序命令
- gdb调试服务程序运行日志
本文来自博客园,作者:skyuz,转载请注明原文链接:https://www.cnblogs.com/skyzu2333/p/14379885.html