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小技巧总结:

  1. 冠以“shell” 可以去掉终端命令
  2. 日志功能:set logging on
  3. 观察功能:watchpoint 查询变量新旧值是否改变
  4. 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调试总结:

  1. gdb基本常用命令
  2. gdb调试多进程服务程序命令
  3. gdb调试多线程服务程序命令
  4. gdb调试服务程序运行日志
posted @ 2021-02-05 21:49  skyuz  阅读(224)  评论(0)    收藏  举报