编译器 GCC
IDE vscode pycharm
调试器 GDB (GCC的模型编译器)
GDB官网
一个中文教程
gdb 命令
在终端中使用 man gdb
可以看到gdb有那些命令
list 列出 读取的代码 每次list的显示的有限,可以继续list
run 运行程序 简写为r
next 一步一步调试 简写为n
quit 退出gdb模式
break 打断点 简写为b
通过前面加shell 可以使用本身终端的功能
shell ls 可以查看当前路径下有那些文件
shell cat 具体文件名,可以像在终端用 cat命令查看文件一样
info b #看在哪里打了断点 (查看断点的情况)
gdb 打了断点后如何去看变量的信息
print 简称 p
也可以打印地址
p &arr[0]
step 步入
step步入 简写为s
设置日志模式
set logging on #旧
set logging enabled on #新
可以记录你进行了那些gdb调试
只会记录你开启之后的,敲这个命令前的操作是不会有记录的。
并且其针对的是这次调试,下次调试需要你再次使用这个命令。
并且下次开启是继续在gdb.txt中记录,不会删除以前的记录
watchpoint
wathchpoint和breakpoint是同一级别的
可以用来观察一个值有没有变
监控一个地址下的值
watch *地址
info wathpoint 或 info watchpoints
但我实操没记录
(gdb) set logging enabled on
Copying output to gdb.txt.
Copying debug output to gdb.txt.
(gdb) list
1 #include <main.h>
2 #include <hello.h>
3
4 using namespace std;
5 int main(){
6 // cout<<"hello"<<endl;
7
8 int arr[4]={1,2,3,4};
9 int i=0;
10 for (i=0;i<4;i++){
(gdb) b 9
Breakpoint 1 at 0x1200: file /home/aaa/workspace/Git_learn/Git_Attempt_001/src/ main.cpp, line 9.
(gdb) r
Starting program: /home/aaa/workspace/Git_learn/Git_Attempt_001/output/Git_Attempt_001
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main () at /home/aaa/workspace/Git_learn/Git_Attempt_001/src/ main.cpp:9
9 int i=0;
(gdb) p &i
$1 = (int *) 0x7fffffffd94c
(gdb) watch *0x7fffffffd94c
Hardware watchpoint 2: *0x7fffffffd94c
(gdb) info watchpoints
Num Type Disp Enb Address What
2 hw watchpoint keep y *0x7fffffffd94c
(gdb) n
10 for (i=0;i<4;i++){
(gdb) n
11 printf("输出 %d\n",arr[i]);
(gdb) n
输出 1
10 for (i=0;i<4;i++){
(gdb) n
11 printf("输出 %d\n",arr[i]);
(gdb) n
输出 2
10 for (i=0;i<4;i++){
(gdb)
去看i的值 也没有提示变化,母鸡啊
(gdb) watch i
Hardware watchpoint 2: i
(gdb) info watchpoints
Num Type Disp Enb Address What
2 hw watchpoint keep y i
(gdb) n
10 for (i=0;i<4;i++){
(gdb) n
11 printf("输出 %d\n",arr[i]);
(gdb) n
输出 1
10 for (i=0;i<4;i++){
(gdb) n
11 printf("输出 %d\n",arr[i]);
(gdb) n
输出 2
10 for (i=0;i<4;i++){
(gdb)
调试一个core文件
Core 文件是系统在程序崩溃时生成的内存转储文件。它捕获了程序在崩溃时的内存状态,包括寄存器内容、堆栈内容、活动内存区域和其它相关的调试信息。这些文件通常用于调试,帮助开发者确定程序崩溃的原因和所在的位置。
这个调试错误文件在linux中不是默认有的,要进行设置
在终端中ulimit -a
可以看到 core file size哪一项为0
-a 显示目前资源限制的设定。
-c <core文件上限> 设定core文件的最大值,单位为区块。
-d <数据节区大小> 程序数据节区的最大值,单位为KB。
-f <文件大小> shell所能建立的最大文件,单位为区块。
-H 设定资源的硬性限制,也就是管理员所设下的限制。
-m <内存大小> 指定可使用内存的上限,单位为KB。
-n <文件数目> 指定同一时间最多可开启的文件数。
-p <缓冲区大小> 指定管道缓冲区的大小,单位512字节。
-s <堆叠大小> 指定堆叠的上限,单位为KB。
-S 设定资源的弹性限制。
-t <CPU时间> 指定CPU使用时间的上限,单位为秒。
-u <程序数目> 用户最多可开启的程序数目。
-v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB。
设置成生成错误报告文件
ulimit -c unlimited
然后我这个Ubuntu 是apport在管理
gdb 正在运行的程序
后台执行
./output/Git_Attempt_001 &
会返回一个 pid 进程号
也可以
ps -ef | grep Git_Attempt_001
然后
gdb -p pid