GDB调试方法汇总

gcc常用选项

选项 含义描述
-o filename 指定输出文件名,在编译目标代码时,可不选,不指定filename时,默认文件名是a.out
-c 只编译不链接,生成目标文件.o
-S 只编译不汇编,生成汇编代码
-E 只进行预编译,不做其他处理
-g  生成的执行文件中包含调试信息
-v 打印编译过程中的命令行信息和编译器的版本号
-I dir 在头文件的搜索路径列表中添加dir目录
-L dir 在库文件的搜索路径列表中添加dir目录
-static 链接静态库
-library 链接名为library的库文件
-Dmacro 定义指定的宏,使它能够通过源码中的#ifdef进行检验
-O -O2 -O3 将优化状态打开,该选项不能和-g选项联合使用
-Wall 将警告看做是错误,发生警告时取消编译
-Werror 在发生警告时取消编译操作,将警告看作是错误
-w 禁止所有的报警
-pedantic 严格要求符合ANSI标准

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 gdb常用命令

命令 含义描述
file 装入想要调试的可执行文件(需携带调试信息)
run 执行当前调试的程序
kill 终止正在调试的程序
step 执行一行或者进入函数内部
next 执行一行但不进入函数内部
break 设置断点
print 打印表达式或者变量
list 列出可执行文件中的源代码的一部分
quit 退出gdb
watch 监视变量而不管何时它被改变
backtrace 回溯跟踪
frame n 定位到发生错误的代码段,n为backtrace命令输出的栈的序号
examine 查看内存地址中的值
jump 是程序跳转执行
signal 产生信号量
return 强制函数返回
call 强制函数调用
make 使用户不退出gdb就可以重新产生可执行文件
shell 使用户不离开gdb就可以使用LInux的shell命令

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 break用法

命令 描述
break 指定函数断点,C++可以使用class::function或者function(type,type)格式指定函数名
break 指定行号断点
break +offset 当前行号的前面offset行停住
break -offset 当前行号的后面offset行停住
break filename:linenum 在源文件filename的linenum行停住
break filename:function 在源文件filename的function处停住
break *address 在程序运行的内存地址处停住
break 没有参数,表示下一行停住
break ...if 条件断点

 

 

 

 

 

 

 

 

 

 

 display命令

命令 描述

undisplay

delete display

删除自动显示,dnums为已经设置了的自动显示的编号,同时删除几个,可以使用空格隔开,删除一个范围可以使用-例如2-5

disable display

enable display

不删除自动显示的设置,而只是让其失效或者恢复
info display  查看display设置的自动显示信息

 

 

 

 

 

 

list命令

命令 描述
list 显示linenum周围的源程序
list 显示函数function周围的源程序
list 显示当前行后面的源程序
list - 显示当前行前面的源程序
set listsize 设置一次显示源代码的行数
show listsize 查看当前listsize的设置
list , 查看从first到last行之间的源代码
list , 显示从当前行到last行之间的源代码
list + 向后显示源代码

 

 

 

 

 

 

 

 

 

 

 (学习视频c++调试技术_哔哩哔哩_bilibili)

部分资料来源上述视频。

 vscode终端输入gdb main启动调试

输入layout split 查看源代码和汇编代码

GDB调试方法汇总_第1张图片

 远程调试的launch.json文件

GDB调试方法汇总_第2张图片

 GDB调试方法汇总_第3张图片

 附加进程调试(c++调试技术-3-附加进程调试-多线程调试_哔哩哔哩_bilibili)

-exec print n  调试控制台执行gdb命令

GDB调试方法汇总_第4张图片

 查看内存地址  -exec x /20bx  地址   (b表示字节显示,x表示十六进制)

-exec x /20bc 地址 (c表示字符显示)

-exec x /20bs 地址 (s表示字符串显示)

查看断点 info breakpoints  简写 i b 断点编号  查看指定断点信息,如果不指定断点编号,则查看所有断点信息。

查看栈信息  bt简写

删除断点:

命令 描述
clear 函数名 删除函数名断点
clear 函数名(参数) 根据函数签名删除断点
clear 行号 删除行断点
clear 文件名:行号
delete 删除断点  简写 d 或者 del

delete 断点编号 

delete 断点范围

delete 所有断点

disable 简写dis,断点编号或者断点范围 n1-n2 dis  5-7
enable 简写en,ena,断点编号 或者范围 en 5-7
enable once 断点编号 只断一次
enable count 数量 断点编号 断指定次数
ignore 断点编号 次数 忽视前多少次

 

 

 

 

 

 

 

 

 

 

 

 

 

 保存断点  save breakpoints  point(文件名)

读取断点  gdb filename -x  point(保存断点的文件名)

gdbserver远程调试:

远程服务器运行 gdbserver  ip:port  ./main

本地进入gdb,执行 target remote ip:port  这里的ip和port 就是远程机器的IP和port,远程调试不能使用run命令,使用c命名。

gdbserver远程attach:先运行程序,在通过ps -ef | grep main 获取pid,

再执行gdbserver ip:port --attach pid 

本地进入gdb,执行 target remote ip:port  这里的ip和port 就是远程机器的IP和port,远程调试不能使用run命令,使用c命名。

GDB调试方法汇总_第5张图片

 查看栈:

bt 显示调用栈信息

bt 帧数  显示指定数量的栈(编号从小到大)

bt -栈帧数  显示指定数量的栈帧(栈帧编号从大到小)

backtrace full 显示所有栈帧的局部变量

frame 简写 f,显示当前栈帧

f 帧编号,切换指定栈

up n向上移动n个位置

down n向下移动n个位置

info locals 查看当前帧的局部变量

GDB调试方法汇总_第6张图片

 GDB调试方法汇总_第7张图片

 gdb attach pid  附加进程

生成core文件  gcore  main-release.core, 然后detach,退出后执行 gdb  main main-release.core

查看线程  i thread

 切换线程 thread 线程号

你可能感兴趣的:(linux,运维,服务器)