文档章节

GDB使用示例(1)

樂天
 樂天
发布于 2015/07/31 00:45
字数 1170
阅读 577
收藏 0

##参考 gdb的使用方法
使用gdb调试程序
gdb调试

##编辑文件

$ vim test.c

#include <stdio.h>
int main()
{
    int i = 2;
    printf("%d\n", i);  
    return 0;
}

##编译

$ gcc -o test -g test.c

##示例1

注意,(gdb)是提示符。

使用gdb打开之:

letian $ gdb test 
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb)

列出代码:

(gdb) list
1   #include <stdio.h>
2   int main()
3   {
4       int i = 2;
5       printf("%d\n", i);  
6       return 0;
7   }

用run或者r运行程序:

(gdb) run
Starting program: /home/letian/Desktop/code/c/test 
2
[Inferior 1 (process 4372) exited normally]
(gdb) r
Starting program: /home/letian/Desktop/code/c/test 
2
[Inferior 1 (process 4376) exited normally]

##示例2

start程序,停在main()的开始处:

$ gdb test 
(gdb) start
Temporary breakpoint 1 at 0x400535: file test.c, line 4.
Starting program: /home/letian/Desktop/code/c/test 

Temporary breakpoint 1, main () at test.c:4
4       int i = 2;

此时int i = 2;还没有执行,输出i的值:

(gdb) print i
$1 = 0

执行int i = 2;,输出i的值:

(gdb) step
5       printf("%d\n", i);  
(gdb) print i
$2 = 2
(gdb) 

执行printf("%d\n", i);,直接把2输出了:

(gdb) step
2
6       return 0;

结束程序的执行:

(gdb) step
7   }
(gdb) step
0x00007ffff7a36ec5 in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) step
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 4403) exited normally]

退出gdb:

(gdb) quit

##示例3

将代码修改为:

#include <stdio.h>
int main()
{
    int i = 2;
    printf("%d\n", i);  
    return -1;
}

并重新编译。

sstep的简写,qquit的简写。现在重新gdb下:

$ gdb test             
......
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) start
Temporary breakpoint 1 at 0x400535: file test.c, line 4.
Starting program: /home/letian/Desktop/code/c/test 

Temporary breakpoint 1, main () at test.c:4
4       int i = 2;
(gdb) s
5       printf("%d\n", i);  
(gdb) s
2
6       return -1;
(gdb) s
7   }
(gdb) s
0x00007ffff7a36ec5 in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) s
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 4562) exited with code 0377]
(gdb) s
The program is not being run.
(gdb) q
$

##示例4

$ gdb test             
......
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) list      # 列出源码
1   #include <stdio.h>
2   int main()
3   {
4       int i = 2;
5       printf("%d\n", i);  
6       return -1;
7   }

(gdb) b 5       # 在第5行设置断点
Breakpoint 1 at 0x40053c: file test.c, line 5.

(gdb) info breakpoints   # 断点信息,只有一个断点,编号是1
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040053c in main at test.c:5

(gdb) start
Temporary breakpoint 2 at 0x400535: file test.c, line 4.
Starting program: /home/letian/Desktop/code/c/test 

Temporary breakpoint 2, main () at test.c:4
4       int i = 2;
(gdb) n         # 执行i=2,然后就到断点(第5行了)

Breakpoint 1, main () at test.c:5
5       printf("%d\n", i);  
(gdb) n         # 执行printf(此处是断点)
2

6       return -1;
(gdb) n

7   }
(gdb) n
0x00007ffff7a36ec5 in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6

(gdb) info breakpoints
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000040053c in main at test.c:5
    breakpoint already hit 1 time

(gdb) delete 
Delete all breakpoints? (y or n) y

(gdb) info breakpoints
No breakpoints or watchpoints.

##重新编写源代码test.c

#include <stdio.h>
int main()
{
    int a = 2;
    int b = 9;
    int c = a+b;
    printf("%d\n", c);  
    return -1;
}

重新编译:

$ gcc -o test -g test.c

##示例5 使用break(简写为b)设置断点。

$ gdb test
....
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) list
1   #include <stdio.h>
2   int main()
3   {
4       int a = 2;
5       int b = 9;
6       int c = a+b;
7       printf("%d\n", c);  
8       return -1;
9   }
(gdb) b 6           # 在第6行设置断点
Breakpoint 1 at 0x400543: file test.c, line 6.
(gdb) run           # 运行到断点处
Starting program: /home/letian/Desktop/code/c/test 

Breakpoint 1, main () at test.c:6
6       int c = a+b;
(gdb) print a
$1 = 2
(gdb) print b
$2 = 9
(gdb) print c       # 值为0,还没进行a+b
$3 = 0
(gdb) print d       # 不存在变量d
No symbol "d" in current context.
(gdb) n             # 下一步
7       printf("%d\n", c);  
(gdb) print c       # c有值了
$4 = 11
(gdb) n
11
8       return -1;
(gdb) n
9   }
(gdb) n
0x00007ffff7a36ec5 in __libc_start_main () from /lib/x86_64-linux-gnu/libc.so.6

##示例6 使用continue(简写为c)运行到下一个断点处。

$ gdb test
......
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) list
1   #include <stdio.h>
2   int main()
3   {
4       int a = 2;
5       int b = 9;
6       int c = a+b;
7       printf("%d\n", c);  
8       return -1;
9   }

(gdb) b 4
Breakpoint 1 at 0x400535: file test.c, line 4.

(gdb) b 6
Breakpoint 2 at 0x400543: file test.c, line 6.

(gdb) run  # 运行到断点处
Starting program: /home/letian/Desktop/code/c/test 

Breakpoint 1, main () at test.c:4
4       int a = 2;
(gdb) c    # continue,运行到下一个断点处
Continuing.

Breakpoint 2, main () at test.c:6
6       int c = a+b;
(gdb) c
Continuing.
11
[Inferior 1 (process 5148) exited with code 0377]
(gdb) 

© 著作权归作者所有

樂天
粉丝 138
博文 674
码字总数 147858
作品 3
深圳
程序员
私信 提问
[IBM] 使用 google-perftools 剖析程序性能瓶颈

google-perftools 是一款针对 C/C++ 程序的性能分析工具,它是一个遵守 BSD 协议的开源项目。使用该工具可以对 CPU 时间片、内存等系统资源的分配和使用进行分析,本文将重点介绍如何进行 CP...

红薯
2010/12/20
2.7K
2
gdb工具详解

gdb调试工具的作用: 1,设置断点。 2,监视程序变量的值。 3,程序的单步执行。 4,显示/修改变量的值。 5,显示/修改寄存器的值。 6,查看程序的堆栈的使用情况。 7,远程调试。 使用示例:...

zhanggong
2016/01/02
25
0
Linux下gdb用法简单介绍

GDB是GNU开源组织发布的一个强大的UNIX下调试程序工具。或许各位比较喜欢那种图形界面方式的,像VC,BCB等IDE的调试,但如果你是在UNIX平台下作软件,你会发现GDB这个调试工具有比VC,BCB的图...

长平狐
2013/01/06
148
0
Linux下gdb用法简单介绍

GDB是GNU开源组织发布的一个强大的UNIX下调试程序工具。或许各位比较喜欢那种图形界面方式的,像VC,BCB等IDE的调试,但如果你是在UNIX平台下作软件,你会发现GDB这个调试工具有比VC,BCB的图...

晨曦之光
2012/03/02
5.3K
0
GDB中的常用命令

转载于博客:http://blog.csdn.net/liigo/article/details/582231,如有侵权,请告知删除。 命令 解释 示例 file 加载被调试的可执行程序文件。 因为一般都在被调试程序所在目录下执行GDB,因...

oqqHuTu12345678
2017/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
12分钟前
0
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
13分钟前
2
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
16分钟前
1
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
22分钟前
3
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
46分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部