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 | 设置断点 |
打印表达式或者变量 | |
list | 列出可执行文件中的源代码的一部分 |
quit | 退出gdb |
watch | 监视变量而不管何时它被改变 |
backtrace | 回溯跟踪 |
frame n | 定位到发生错误的代码段,n为backtrace命令输出的栈的序号 |
examine | 查看内存地址中的值 |
jump | 是程序跳转执行 |
signal | 产生信号量 |
return | 强制函数返回 |
call | 强制函数调用 |
make | 使用户不退出gdb就可以重新产生可执行文件 |
shell | 使用户不离开gdb就可以使用LInux的shell命令 |
break用法
命令 | 描述 |
break <function> | 指定函数断点,C++可以使用class::function或者function(type,type)格式指定函数名 |
break <linenum> | 指定行号断点 |
break +offset | 当前行号的前面offset行停住 |
break -offset | 当前行号的后面offset行停住 |
break filename:linenum | 在源文件filename的linenum行停住 |
break filename:function | 在源文件filename的function处停住 |
break *address | 在程序运行的内存地址处停住 |
break | 没有参数,表示下一行停住 |
break ...if <condition> | 条件断点 |
display命令
命令 | 描述 |
undisplay <dnums...> delete display <dnusm...> | 删除自动显示,dnums为已经设置了的自动显示的编号,同时删除几个,可以使用空格隔开,删除一个范围可以使用-例如2-5 |
disable display <dnums...> enable display <dnums...> | 不删除自动显示的设置,而只是让其失效或者恢复 |
info display | 查看display设置的自动显示信息 |
list命令
命令 | 描述 |
list <linenum> | 显示linenum周围的源程序 |
list <function> | 显示函数function周围的源程序 |
list | 显示当前行后面的源程序 |
list - | 显示当前行前面的源程序 |
set listsize <count> | 设置一次显示源代码的行数 |
show listsize | 查看当前listsize的设置 |
list <first>,<last> | 查看从first到last行之间的源代码 |
list ,<last> | 显示从当前行到last行之间的源代码 |
list + | 向后显示源代码 |
(学习视频c++调试技术_哔哩哔哩_bilibili)
部分资料来源上述视频。
vscode终端输入gdb main启动调试
输入layout split 查看源代码和汇编代码
远程调试的launch.json文件
附加进程调试(c++调试技术-3-附加进程调试-多线程调试_哔哩哔哩_bilibili)
-exec print n 调试控制台执行gdb命令
查看内存地址 -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命名。
查看栈:
bt 显示调用栈信息
bt 帧数 显示指定数量的栈(编号从小到大)
bt -栈帧数 显示指定数量的栈帧(栈帧编号从大到小)
backtrace full 显示所有栈帧的局部变量
frame 简写 f,显示当前栈帧
f 帧编号,切换指定栈
up n向上移动n个位置
down n向下移动n个位置
info locals 查看当前帧的局部变量
gdb attach pid 附加进程
生成core文件 gcore main-release.core, 然后detach,退出后执行 gdb main main-release.core
查看线程 i thread
切换线程 thread 线程号