一. GDB调试

1.什么是gdb:

文档官网:https://www.sourceware.org/gdb/

GDB是GNU项目调试器,允许您查看一个程序执行时“内部”发生了什么,或者一个程序崩溃时正在做什么。

2.gdb是干啥的

2.1 gdb只要做四件事:

启动程序,指定可能影响其行为的任何内容。

使程序在指定条件下停止。

检查程序停止时发生了什么。

更改程序中的内容,这样您就可以尝试纠正一个错误的影响,并继续了解另一个错误。

2.2 可以调试的程序:

gdb可以调试指定的当前程序,向程序中传递参数

gdb还可以调试出错的文件,查看错误原因

gdb还可以调试正在运行的进程

 3 如何使用gdb

(1)准备C++程序

(2)编译程序,编译选项中需要加上 -g

g++ -g ***.cpp -o ***

(3)启动gdb调试

gdb ./***

4. GDB常用指令

(1)quit退出

quit (或者用q):表示退出gdb调试

(2)run执行

run (r):表示执行可执行程序,如果没有设置断点,则将整个程序从头到尾执行一遍

(3) list展示程序

list(l):展示可执行程序的相关行信息,默认展示10行

list m,n :表示展示从m行到n行的信息

list func:表示展示func函数旁边的相关程序

(5) break断点

break(b):表示设置断点,当调试器将程序运行到断点所在位置后,会暂停于此

break 行号:表示在某行设置断点

break func:表示在指定的函数处设置断点

info break:查看所有断点的信息

delete breakpoint 断点编号:表示删除指定的断点(注意:端点编号不是代码行号)

(7)next下一步操作

next(n):表示执行下一条语句

(8)continue向后执行,直到下一个断点

continue(c):表示从断点处继续向后执行,直到遇到下一个断点或者程序结束

(9)step 跳入函数中

step(s):能够跳入到指定函数中,查看相关函数内部代码

(10)print 打印变量/地址信息

print(p) 变量名/地址 :表示打印指定变量或地址信息

(11)variable 设置值

set variable 变量名=值:表示给某个变量设置相关的值

总结

 

5 gdb使用小技巧

(1) shell指令

shell :后面可以跟终端指令,表示执行终端相关操作

(2)日志

set logging on:设置开启日志功能,会在当前目录中生成一个gdb.txt文件记录接下来的调试内容

(3)watchpoint

watchpoint :观察点,如果设置的观察点的值发生改变,则会将该值的旧值和新值全部展示出来

 

6 调试出错的文件

当一个可执行程序出现错误时,会产生一个core文件,用于查看相关错误信息

linux系统默认是不产生core文件,需要进行相关设置后才能产生

通过ulimit -a 查看所有linux的限制内容

 

通过 ulimit -c unlimited来设置core文件的个数

 

 

关于core如果以上操作执行后还是没有出现,那么执行这里面的操作

 

完整执行core操作流程

 

重点这句话:echo'./core.%p'>/proc/sys/kernel/core_pattern

执行指令:gdb ./test04 core-xxx

 

7 调试其他正在运行的进程

调试指定进程

gdb -p 进程号    调试指定的进行进程

语法

./可执行程序 & 

表示将可执行程序后台运行,不占用当前终端

 

进程号类似身份证,是系统运行的唯一标识(后续进程在详细讲解)

 

8. gcc和g++参照

01test.cpp中头文件有iostream和stdio.h(假设这个被注释),同时输出printf,利用g++编译器会报错,

同时拷贝一个.c文件(只有被注释的stdio.h头文件)利用gcc编译器,此时会发出警告,但是结果照样显示

 

总结:

相比于gcc编译器,g++编译器要求更加严格
警告可以被忽略,继续产生可执行程序,但是错误必须更改后才能产生可执行程序

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐