C语言 gdb 调试工具 介绍 安装 使用 及常见错误
gdb介绍
GDB, 又称GNU调试器,是UNIX及UNIX-like下的调试工具,帮助调试我们程序的工具。 更加详细的介绍,参考gdb官网:http://www.gnu.org/software/gdb/
它支持下面的语言:
Ada
Assembly
C
C++
D
Fortran
Go
Objective-C
OpenCL
Modula-2
Pascal
Rust
gdb安装
linux下安装gdb工具
centos: yum install -y gdb ubuntu: apt-get install gdb
调试过程中如果报如下错误:
Missing separate debuginfos, use: debuginfo-install glibc-XXX
解决方法:
先将"/etc/yum.repos.d/CentOS-Debuginfo.repo"启用,将文件的enable=1; yum install -y glibc debuginfo-install glibc-XXX
gdb快速使用
#先生成执行文件e gcc -g -o e e.c gdb e #直接装入需要调试的程序 run #开始运行程序 quit #退出GDB环境 或者 gdb #进入GDB环境 file e #装入需要调试的程序 run #开始运行程序 quit #退出GDB环境
gdb详细参数及其用法
参数列表
#c脚本
#include <stdio.h> void debug(char *str) { printf("debug info :%s\n",str ); } main(int argc,char *argv[]){ int i,j; j=0; for(i=0;i<10;i++){ j+=5; printf("now a=%d\n", j); } }
list 命令用法
list命令显示多行源代码,从上次的位置开始显示,默认情况下,一次显示10行,第一次使用时,从代码起始位置显示
list n显示已第n行未中心的10行代码
list functionname显示以functionname的函数为中心的10行代码
list - 显示刚才打印过的源代码之前的代码
(gdb) list #显示前10行 1 //e.c 2 #include <stdio.h> 3 void debug(char *str) 4 { 5 printf("debug info :%s\n",str ); 6 } 7 main(int argc,char *argv[]){ 8 int i,j; 9 j=0; 10 for(i=0;i<10;i++){ (gdb) #回车 或者 list 继续显示 11 j+=5; 12 printf("now a=%d\n", j); 13 } 14 } (gdb) # 显示完提示 Line number 15 out of range; haha.c has 14 lines.
break 断点命令
break location:在location位置设置断点,该位置可以为某一行,某函数名或者其它结构的地址,GDB会在执行该位置的代码之前停下来
delete breakpoints :断点号 删除断点
clear n :表示清除第n行的断点,因此clear 10等同于delete breakpoints 1
disable/enable n :表示使得编号为n的断点暂时失效或有效
断点号说明:
这里的断点号表示的是第几个断点,下面例子中执行break 11返回 reakpoint 1 at 0x40050a: file e.c, line 11.中的1表示该断点的标号,因此使用 delete breakpoints 1表示删除第10行所定义的断点
(gdb) break 11 Breakpoint 1 at 0x400573: file haha.c, line 11. (gdb) r Starting program: /tmp/a.out Breakpoint 1, main (argc=1, argv=0x7fffffffe598) at haha.c:11 11 j+=5; (gdb) c Continuing. now a=5 Breakpoint 1, main (argc=1, argv=0x7fffffffe598) at haha.c:11 11 j+=5; (gdb) c Continuing. now a=10 Breakpoint 1, main (argc=1, argv=0x7fffffffe598) at haha.c:11 11 j+=5; ... ... (gdb) c Continuing. now a=50 [Inferior 1 (process 12948) exited with code 011] (gdb) c The program is not being run.
info breakpoints :查看断点相关的信息
(gdb) info breakpoints No breakpoints or watchpoints. (gdb) break 10 Breakpoint 1 at 0x40056a: file haha.c, line 10. (gdb) break 12 Breakpoint 2 at 0x400577: file haha.c, line 12. (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x000000000040056a in main at haha.c:10 2 breakpoint keep y 0x0000000000400577 in main at haha.c:12 (gdb)
display 变量名: 查看参数的值
也可以使用disable,enable,delete,info命令修改及查看其状态,用法与对断点的一样
(gdb) break 11 Breakpoint 1 at 0x400573: file haha.c, line 11. (gdb) r Starting program: /tmp/a.out Breakpoint 1, main (argc=1, argv=0x7fffffffe598) at haha.c:11 11 j+=5; (gdb) display j 1: j = 0 (gdb) c Continuing. now a=5 Breakpoint 1, main (argc=1, argv=0x7fffffffe598) at haha.c:11 11 j+=5; 1: j = 5 (gdb) display j 2: j = 5 (gdb) display j*2 3: j*2 = 10 (gdb) info display Auto-display expressions now in effect: Num Enb Expression 3: y j*2 2: y j 1: y j (gdb) delete display 1 (gdb) info display Auto-display expressions now in effect: Num Enb Expression 3: y j*2 2: y j (gdb)
step 及 next 命令
step可使得程序逐条执行,即执行完一条语句然后在吓一跳语句前停下来,等待用户的命令
一般使用step命令是,可使用display或者watch命令查看变量的变化,从而判断程序行为是否符合要求
当下一条指令为函数时,s进入函数内部,在其第一条语句前停下来
step n,next n 表示连续但不执行n条指令,如果期间遇到断点,则停下来
参考链接:https://www.cnblogs.com/HKUI/p/8955443.html
共 0 条评论