• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

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详细参数及其用法

参数列表

image.png

#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
0
下一篇:Anki 世界最流行记忆软件 高效学习神器

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。