网站建设用哪个软件,溧阳市住房和城乡建设局网站,做我女朋友好吗网站,公司展示型网站很早就想在好好学一学gdb了#xff0c;正好最近学算法#xff08;以前一直以为干硬件不需要什么特别厉害的算法#xff0c;结果现在卷起来了。大厂面试题也有复杂一些的算法了#xff09;
下面的这些命令是别的博主总结的
GDB 调试过程_gdb调试过程_麷飞花的博客-CSDN博客…
很早就想在好好学一学gdb了正好最近学算法以前一直以为干硬件不需要什么特别厉害的算法结果现在卷起来了。大厂面试题也有复杂一些的算法了
下面的这些命令是别的博主总结的
GDB 调试过程_gdb调试过程_麷飞花的博客-CSDN博客
工具书
GDB 1.gdb 启动gdb 2.gdb -tui 启动gdb并且分屏显示源代码 3.gdb app 启动gdb调试指定程序app 4.gdb program PID 启动程序之后再用gdb调试 5.gdb PID 启动程序之后再启动gdb调试 6.**启动gdb之后的交互命令 file app 载入指定的程序 7.set args var 修改发送给程序的参数 Iist linenum 行号。 offset 当前行号的正偏移量。 -offset 当前行号的负偏移量。 filename:linenum 哪个文件的哪一行。 function 函数名。 filename:function 哪个文件中的哪个函数。 *address 程序运行时的语句在内存中的地址。 set listsize count 设置一次显示源代码的行数。 show listsize 查看当前listsize的设置。 break number 当前的文件中某一行假设为6设定断点。 number if conf 如果conf成立就在number行处断点。 func 当前的文件中为某一函数(假设为func)处设定断点。 fileName:N 给指定文件fileName的某个行N处设置断点 enable/ena N启用断点 disable/dis N禁用断点 显示当前gdb断点信息 info breakpoints i breakpoints i b print/p 1.print var print显示变量(var)值 2.print /x var 用16进制显示(var)值 x 按十六进制格式显示变量。 d 按十进制格式显示变量。 u 按十六进制格式显示无符号整型。 o 按八进制格式显示变量。 t 按二进制格式显示变量。 a 按十六进制格式显示变量。 c 按字符格式显示变量。 f 按浮点数格式显示变量。 3.print *a10 a是一个数组10个元素 4.print x4 修改运行时候的变量值 其它 1.finish 执行完当前函数返回到调用它的函数 2.until/u 指定程序直到退出当前循环体 3.jump 5 跳转执行程序到第5行 4.return 强制返回当前函数 5.call expr 强制调用函数: print expr 强制调用函数2 【如果函数的返回值是void那么call不会打印返回值但是print还是会打印出函数的返回值并且存放到历史记录中。】 6.kill 终止一个正在调试的程序 7.display追踪查看具体变量值 undisplay取消追踪观察变量 8. watch被设置观察点的变量发生修改时打印显示 i watch显示观察点 layout layout用于分割窗口可以一边查看代码一边测试。主要有以下几种用法 layout src显示源代码窗口 layout asm显示汇编窗口 layout regs显示源代码/汇编和寄存器窗口 layout split显示源代码和汇编窗口 layout next显示下一个layout layout prev显示上一个layout Ctrl L刷新窗口 Ctrl x再按1单窗口模式显示一个窗口 Ctrl x再按2双窗口模式显示两个窗口 Ctrl x再按a回到传统模式即退出layout回到执行layout之前的调试窗口。 多线程调试 (1)查看可切换调试的线程info threads (2)切换调试的线程thread 线程id (3)只运行当前线程set scheduler-locking on (4)运行全部的线程set scheduler-locking off (5)指定某线程执行某gdb命令thread apply 线程id gdb_cmd (6)全部的线程执行某gdb命令thread apply all gdb_cmd 例程一
#include stdio.h
#include stdlib.hint flag 0;typedef struct node{int data;struct node *next;
}list,*link;
void pp(int num)
{if(flag 1){switch(num){case 0:printf(\nError%d: Failed to malloc!\n,num);break;default:printf(\nError: unknown error!\n);}}
}link create()
{link ll;if((ll (link)malloc(sizeof(link))) NULL){pp(0);return NULL;}ll-data 0;ll-next NULL;return ll;
}void l_free(link ll)
{link p;while(ll){p ll;ll ll-next;printf(free:%d\n,p-data);p-next NULL;free(p);p NULL;}
}void l_show(link ll)
{link p;p ll;while(p){printf(%d,p-data);p p-next;}
}int l_in(link ll)
{int *p,*p1;link q;link s;q ll;printf(input );scanf(%d,p);getchar();p1 p;while(p){if((s (link)malloc(sizeof(link))) NULL){pp(0);return -1;}s-data *p1;q-next s;s-next NULL;p1;q q-next;}l_show(ll);return 0;
}int main()
{link ll;ll create();l_in(ll);l_free(ll);return 0;
}在编译文件的时候加入 -g就能进行程序调试
我记得exit也能退出的不知道为什么不行了
反正quit/q都是可以退出的查了一下好像是版本问题我的ubuntu18.04好像是不行 那个tui没整好不过无所谓工具是为了方便大家使用的而不是来扭曲我们的思想和习惯。
用他好用的地方就好了其实我以前一直很喜欢打印来找错误这是驱动的习惯因为驱动不用gdb但是驱动的实习找不到啊只好学学软件开发的东西先找个软件实习了。 加个断点 这次就没有溢出了因为在输入这里停了。 C继续执行很好又溢出了 n单步执行问题出现了就是输入的时候就G了。
回车也是单步执行
可以tab补全还可以看之前的命令
当运行到函数的时候要按step进入函数内单步执行
不然n就是直接执行完这个函数
l可以查看后面几行程序
p可以查看变量和函数的地址或值
info是查询可以简写成i
i b
可以查询断点 i reg
查询寄存器 i r也可以
delete删除全部断点也可以指定删除
简写为d