ubuntu下gdb代码调试

1.什么是GDB?

GDB全称是GNU Project Debugger,当程序执行时,让你可以进入到另一个程序的内部查看,或者当一个程序崩溃的时候它在做什么。

GDB可以帮助你做如下四种主要的方面,来帮助你捕捉到bug:

1.启动你的程序,指定可能影响你行为的事情(设定初始的一些变量)

2.在特殊的条件的时候暂停你的程序执行(在端点的时候可以暂停,或者说是条件的暂停)

3.当程序暂停的时候,可以查看这个时候发生了什么(查询堆栈,变量)

4.通过改变程序中的参数,你可以通过实验得出某一个bug所产生的影响,然后继续执行(通过不同的设定,来得到不同的结果,本人理解为测试)

这个调试程序,可以由Ada, C, C++, Objective-C, Pascal(或者其他语言写成)。这个程序可以执行在一个相同的机器或者是一个远程的机器上。

2.使用GDB进行调试(快捷键ctrl+d可以退出GDB)

1.首先当然是一言不合就安装GDB:

1 sudo apt-get install gdb

2.接下来本文围绕着一个c语言文件开始调试

废话不说贴代码来看

#include<stdio.h>
int add(int a,int b)
{
        return a+b;
}
int main()
{
        int i =0;
        int c =0;
        while(i<100)
        {
                c=add (i,c);
                printf("c %d",c);
                i++;
        }

        return c;
}

  

$ gcc -g gdbtest.c -o mytest

生mytest文件,接下来进行调试

$ gdb mytest

在main处传入端点,运行到main,调试,其中breakpoint是break的全程,run是r的全程

(gdb) break main
(gdb) r

运行到main处暂停

之后可以单步跟一下,s(step)

(gdb)s

  单步了之后可以查看剩下的代码 l(list)

(gdb) l
4               return a+b;
5       }
6       int main()
7       {
8               int i =0;
9               int c =0;
10              while(i<100)
11              {
12                      c=add (i,c);
13                      printf("c %d",c);

之后单步进入到函数中,可以查看堆栈

(gdb) bt
#0 add (a=0, b=0) at gdbtest.c:4
#1 0x0000000000400568 in main () at gdbtest.c:12

可以通过print来打印变量的值

(gdb) print c
$1 = 1

保存断点(文件名为fig.dp)

(gdb)save breakpoint fig.dp

 

3.更近一步

断点可以通过函数名,文件内的行号来设置,也可以先指定文件名再指定行号,还可以指定与暂停位置的偏移量,或者用地址来设置。

(gdb) break 函数名

(gdb) break 行号

(gdb) break 文件名:行号

(gdb) break 文件名:函数名

(gdb) break +偏移量

(gdb) break -偏移量

(gdb) break *地址

如果不指定位置,则在当前行的下一行下断点

(gdb) break 11  //在十一行下端点
Breakpoint 2 at 0x400559: file gdbtest.c, line 11. //端点2的信息
(gdb) s    //单步
10              while(i<100)  //执行的语句
(gdb) c    //continue,直接进行运行,到达断点停下
Continuing.    

Breakpoint 2, main () at gdbtest.c:12
12                      c=add (i,c);
(gdb) break +2  //在当前运行处下两行下断点
Breakpoint 3 at 0x40057f: file gdbtest.c, line 14.
(gdb) break -1  //在当前行的前一行进行下断点
Note: breakpoint 2 also set at pc 0x400559.
Breakpoint 4 at 0x400559: file gdbtest.c, line 11.
(gdb) break *2   //在地址为0x2处下断
Breakpoint 5 at 0x2

  接下来介绍一些条件断点

 条件断点
(gdb) break 断点 if 条件
(gdb) break 14 if c>4  //当变量c大于4的时候,才在14行处断点停止仅在特定条件下中断。对于已存在的断点,可使用condition为其添加条件。
(gdb) break 断点编号 条件
而删除指定编号断点的触发条件同样使用condition。
(gdb) condition 断点编号
(gdb) condition 2
Breakpoint 2 now unconditional 查询断点(gdb) info break

监视点

要想找到变量在何处被改变,可以使用 watch 命令(监视点, watchpoint)。

(gdb) watch <表达式>

<表达式>发生变化时暂停运行。<表达式>的意思是常量或变量等。

(gdb) awatch <表达式>

<表达式>被访问、改变时暂停运行。

(gdb) rwatch <表达式>

<表达式>被访问时暂停运行。

(gdb) watch i >10
Hardware watchpoint 4: i >10
(gdb) c
Continuing.
Hardware watchpoint 4: i >10

Old value = 0
New value = 1
main () at gdbtest.c:10
10              while(i<100)
(gdb) print i
$1 = 11

  

 1 (gdb) awatch  i
 2 Hardware access (read/write) watchpoint 5: i
 3 (gdb) c
 4 Continuing.
 5 Hardware access (read/write) watchpoint 5: i
 6
 7 Old value = 11
 8 New value = 12
 9 main () at gdbtest.c:10
10 10              while(i<100)

删除断点和监视点

用 delete 命令删除断点和监视点。

(gdb) delete <编号>

显示栈帧

backtrace 命令可以在遇到断点而暂停执行时显示栈帧。此外,backtrace 的别名还有 where 和 info stack。

(gdb) backtrace

显示所有栈帧。

(gdb) backtrace N

只显示开头 N 个栈帧。

(gdb) backtrace -N

只显示最后 N 个栈帧。

(gdb) backtrace full

(gdb) backtrace full N

(gdb) backtrace full -N

不仅显示backtrace,还有显示局部变量。

显示栈帧之后,就可以看出程序在何处停止(即断点的位置),以及程序的调用路径。

显示寄存器

info registers可以显示寄存器。

(gdb) info registers

单步执行

单步执行指的是代码一行行的执行,有两种组成部分s和n,其中s是单步,可以进入函数,而n也是单步,但不进入函数内部。

调试的时候读取保存的断点

gdb hello2 -x fig.dp

要记住加上参数 -x

然后再去查看是否有断点

调试的时候设置参数

1 (gdb) set args a b c
2 (gdb) r

四.上图总结

五.参考文章

http://blog.csdn.net/u011068702/article/details/53931648

http://blog.csdn.net/hzhsan/article/details/7554328

时间: 2024-10-14 06:47:22

ubuntu下gdb代码调试的相关文章

GDB代码调试与使用

GDB代码调试与使用 Linux下GDB调试代码 源代码 编译生成执行文件 gcc -g test.c -o test 使用GDB调试 启动GDB:gdb test 从第一行列出源代码:list 直接回车表示,重复上一次命令 设置断点,在源程序16行处:break 16 设置断点,在函数func()入口处:break func 查看断点信息:info break 运行程序:run 在断点处停住 单条语句执行:next 继续运行程序:continue[程序输出:result[1-100]=5050

GDB远程调试(一)之DM8168下gdb远程调试环境的搭建

1.前言 gdb是较为流行和通用的linux环境调试工具,掌握它对于嵌入式开发工作来说非常必要,能够提高工作效率,快速发现和解决问题.最近有兴趣研究了下gdb使用,特总结如下以备以后查阅. 2.下载最新的gdb 下载地址:http://ftp.gnu.org/gnu/gdb/,选择目前最新的版本下载.我选择了gdb-7.7.tar.gz版本 3.编译gdb和gdbserver (1)解压到你的工作目录: [email protected]:~$ tar -xvf gdb-7.7.tar.gz (

解决os x下gdb不能调试的问题

在较新的os x中使用gdb调试程序会发生 Unable to find Mach task port 之类的错误,这是由于新的os x内核禁止未授权的程序随意控制其他进程,如果不用root权限的话,我们还可以使用程序签名的方式来解决这个问题.(谁又想老是以root权限调试普通程序呢?) 依次进入 应用程序->实用工具,打开钥匙串访问: 选择菜单 钥匙串访问->证书助理->创建证书,第一个步骤如下设置: 然后一直next,最后一个设置如下设置: 最后回到钥匙串访问程序主界面,鼠标右键选中

opensips/kamailio gdb代码调试方法详解

 要对kamailio/opensips进行单步调试,就需要先了解其代码的结构及运行方式,kamailio/opensips使用Reactor和Proactor结合的IO网络模型,使用主进程负责监听网络,当有连接产生或首包到达时,就通过pipe将文件描述符发送给worker进程,worker进程就会负责此连接的数据取读.业务处理.数据发送等事情,然后再次等待此socket事件.当我们想要调试一段代码时,就先确认这段代码是运行在什么类型的进程中,通常用于处理SIP逻辑的代码都是在worker进

android studio下的代码调试技巧的运用

记得当初刚开始学习java的时候,每次在eclipse上遇到调试程序的时候都是敲syso+快捷键,用system.out.printLn.输出语句来调试java的程序,哈哈哈,当初感觉确实蛮方便的,后来慢慢步入到安卓,然后使用安卓版的eclipse,在安卓代码当然是要杜绝java的输出语句了,于是又用输出日志Log的几种方式来调试,偶尔还会用到吐司调试(尴尬),eclipse版本的debug模式当初没怎么用习惯,只会简单的单步调试,于是就荒废了,虽然调试起来有点麻烦,但是用顺手了也还马马虎虎,但

Ubuntu下开启php调试模式,显示报错信息

在Ubuntu下php的缺省设置是不显示错误信息的,如果程序出错会显示“无法处理此请求的错误提示”,这在开发环境下非常不方便. 其实我们只要编辑下apache的配置文件就好 1.我的apache 配置文件目录是/etc/apache2/apache2.conf sudo vim /etc/apache2/apache2.conf 再最后加入以下两行 php_flag display_errors        on php_value error_reporting       2039 2.重

针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调试,从而获得程序运行状态下的信息( 关闭 ALSR 机制 ),基础的 gdb 操作可参见笔者的文章Linux下编辑.编译.调试命令总结--gcc和gdb描述.使用 gdb 可以方便的获取程序动态运行状态下的信息,但通过 gdb 动态调试获取的诸如缓冲区的起始地址等信息可能与程序实际运行时的信息并不相

Ubuntu下YOLOv3代码运行

YOLO是近几年物体检测主要算法之一,2018年已发展到YOLOv3,是目前速度最快的物体检测算法,详细内容可查看YOLO主页.YOLO的主要优势在于基于纯C语言编写的DarkNet,可查看DarkNet主页,不需要其他依赖库,跨平台能力强,运行速度快,这里是下载地址.有趣的是里边的有好几个LICENSE,其中LICENSE.fuck的内容是这样的: DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copy

ubuntu下命令行调试Python程序

Python提供类似于C++ gdb的调试工具pdb,我们可以在Linux下使用pdb在命令行下进行Python程序的调试. 官方参考网站: Python2: https://docs.python.org/2/library/pdb.html Python3: https://docs.python.org/3/library/pdb.html 一般地,我们可以使用如下的方式进入调试(比如我们要调试的源文件为hello.py): 1. 在命令行启动目标程序,加上-m参数. python -m