文档章节

gdb调试Tips

AlphaJay
 AlphaJay
发布于 2012/03/07 18:00
字数 1601
阅读 1298
收藏 1
点赞 0
评论 0

 

step into就是单步执行,遇到子函数就进入并且继续单步执行;
step over是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。
step out就是但单步执行到子函数内时,用step out就可以执行完子函数余下部分,并返回到上一层函
数。

step into:进入子函数      
step over:越过子函数,但子函数会执行
step out:跳出子函数  

Step Into

Executes code one statement at a time.

When not in design mode, Step Into enters break mode at the current line of execution. Step Into executes the statement at the current execution point. If the statement is a call to a procedure, the next statement displayed is the first statement in the procedure.

At design time, this menu item begins execution and enters break modebreak mode before the first line of code is executed. Not available at run time.

If there is no current execution point, the Step Into command may appear to do nothing until you do something that triggers code, for example click on a document.

Toolbar button: . Keyboard shortcut:  F10.

Step Over

Similar to Step Into. The difference in use occurs when the current statement contains a call to a procedure.

Step Over executes the procedure as a unit, and then steps to the next statement in the current procedure. Therefore, the next statement displayed is the next statement in the current procedure regardless of whether the current statement is a call to another procedure. Available in break mode only.

Toolbar button:  . Keyboard shortcut:  F11.

Step Out

Executes the remaining lines of a function in which the current execution point lies. The next statement displayed is the statement following the procedure call. All of the code is executed between the current and the final execution points. Available in break mode only.

Toolbar button:  . Keyboard shortcut:  SHIFT+F11

GDB中

step ->    step into:进入子函数      
next ->     step over:越过子函数,但子函数会执行
finish->   step out:跳出子函数

until->   同step over,主要用于退出循环 

_________________

原文件编译的时候要加-g,例gcc -g -o test test.c, 这样在能在调试的时候用list,watch等命令。

全局变量或当前堆栈区可见的变量才能watch,watch之后用Continuing,就可显示观察变量。



gdb watch 跟踪变量的变化


01 #include <stdio.h>
02 #include <stdlib.h>
03 #include <string.h>
04 
05 int main()
06 {
07     char * name = NULL;
08     int len = 10;
09 
10     name = (char *)malloc(len);
11     strncpy(name, "zengxiaolong", len);
12 
13     char ** wild_pointer;
14     wild_pointer = &name;          // 野指针,指向了变量name
15     *wild_pointer = (char *)0x100; // 野指针,破坏了变量name
16 
17     name[0] = 'a';
18     return 0;
19 }

# gcc test.c -o test -g
# gdb -q test
(gdb) l
1    #include <stdio.h>
2    #include <stdlib.h>
3    #include <string.h>
4    
5    int main()
6    {
7        char * name = NULL;
8        int len = 10;
9    
10        name = (char *)malloc(len);
(gdb) b 7
Breakpoint 1 at 0x80483b5: file test.c, line 7.
(gdb) r
Starting program: /tftpboot/test 

Breakpoint 1, main () at test.c:7
7        char * name = NULL;
(gdb) watch name // 跟踪变量name变化情况
Hardware watchpoint 2: name // 说明该系统结构支持硬件断点
(gdb) c
Continuing.
Hardware watchpoint 2: name

Old value = 0xb7f79dc0 "U\211�WVS��y" // 这里变量name发生了变化
New value = 0x804a008 ""

main () at test.c:11
11        strncpy(name, "zengxiaolong", len);
(gdb) c
Continuing.
Hardware watchpoint 2: name

Old value = 0x804a008 "zengxiaolo"
New value = 0x100 <Address 0x100 out of bounds> // 指针越界了

main () at test.c:17
17        name[0] = 'a';
(gdb)c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x080483fd in main () at test.c:17
17        name[0] = 'a';
(gdb) 

 

譬如建立新文件Watch.c

#include <stdio.h>

int main()
{
    sleep(10);
    printf("Waiting...");

    int i;   
    for(i=0; i<100; i++)
    {  
        printf("I'm %u.\n", i);
    }  
   
    return 0;
}

 

然后  gcc  -g test.c -o test

然后 gdb调试test

在int i;设置断点,此时不能将i设为watchpoint,因为不再context中

(gdb) info b
Num     Type           Disp Enb Address    What
2       breakpoint     keep y   0x00401082 in main at watch.c:8
(gdb) watch i
No symbol "i" in current context.

 

运行程序,当i在context中时添加watchpoint,

此时如果变化则会显示watchpoint的变化,并且停止下来,用continue可以继续

(gdb) r   
Starting program: /home/yueshen/a.exe
[New thread 2484.0x11b4]
[New thread 2484.0x1220]

Breakpoint 2, main () at watch.c:9
(gdb) n
(gdb) watch i
Hardware watchpoint 3: i
(gdb) info b
Num     Type           Disp Enb Address    What
2       breakpoint     keep y   0x00401082 in main at watch.c:8
        breakpoint already hit 1 time
3       hw watchpoint  keep y              i
(gdb) c
Continuing.
Waiting...I'm 0.
Hardware watchpoint 3: i

Old value = 0
New value = 1
0x004010a7 in main () at watch.c:9
(gdb) c
I'm 1.
Continuing.
Hardware watchpoint 3: i

Old value = 1
New value = 2
0x004010a7 in main () at watch.c:9




gdb中看内存(x命令)

你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

x/<n/f/u> <addr>

n、f、u是可选的参数。

n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。

f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

bhwg

x/4bt &a

--------------------------------
<addr>表示一个内存地址。
n/f/u三个参数可以一起使用。例如:

命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

输出格式
一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。



 

© 著作权归作者所有

共有 人打赏支持
AlphaJay
粉丝 77
博文 284
码字总数 313790
作品 0
杭州
如何在GDB中忽略Signal信号处理

在使用GDB调试C/C++程序时,如果刚好程序中需要对特殊Signal处理,则在调试这类应用时需要GDB忽略对该Signal的处理。本文来自GBD官方文档的翻译,仅供参考。 信号(Signals) 信号是一种软中...

artine ⋅ 04/19 ⋅ 0

Debugging with GDB 用GDB调试多线程程序

Debugging with GDB http://www.delorie.com/gnu/docs/gdb/gdb_25.html GDB调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧。 先介绍一下GDB多线...

AlphaJay ⋅ 2011/07/22 ⋅ 0

GDB调试Go程序

说明:作为一门静态语言,似乎支持调试是必须的,而且,Go初学者喜欢问的问题也是:大家都用什么IDE?怎么调试? 其实,Go是为多核和并发而生,真正的项目,你用单步调试,原本没问题的,可能...

kuerant ⋅ 2014/01/29 ⋅ 0

OpenWRT开发之——远程debug

想要用gdb对OpenWrt进行远程调试。首先得在OpenWrt目标机上安装gdbserver。 其实在trunk路径下也有gdb的ipk安装包的,不信find一下。 [trunk]$ find bin/ -name "gdb*.ipk"bin/ar71xx/packag...

临峰不畏 ⋅ 2015/05/18 ⋅ 9

Linux下gdb用法简单介绍

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

长平狐 ⋅ 2013/01/06 ⋅ 0

Linux下gdb用法简单介绍

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

晨曦之光 ⋅ 2012/03/02 ⋅ 0

GDB 7.10 发布,支持 ARM64 系统反向调试

GDB 7.10 发布,此版本能更好的支持远程任务共享库的访问;ARM64 系统反向调试支持;支持 DTrace 静态探测等等,详细改进请看发行说明。 下载:ftp://ftp.gnu.org/gnu/gdb/gdb-7.10.tar.gz G...

oschina ⋅ 2015/08/31 ⋅ 4

程序调试工具--GDB

GDB(GNU symbolic debugger)简单地说就是一个调试工具。它是一个受通用公共许可证即GPL保护的自由软件。 象所有的调试器一样,GDB可以让你调试一个程序,包括让程序在你希望的地方停下,此...

匿名 ⋅ 2009/03/18 ⋅ 0

用GDB调试程序(七)

改变程序的执行 ——————— 一旦使用GDB挂上被调试程序,当程序运行起来后,你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值,这个强大的功能能够让...

地狱的烈火 ⋅ 2013/07/23 ⋅ 0

Qt Creator远程调试嵌入式ARM开发板

在嵌入式开发中,如何使用QT去调试程序是很重要的。除了传统的qDebug打印调试之外,GDB也是业界公认的调试利器。在嵌入式环境中使用GDB相对麻烦一些,主要是利用开发板上的gdbserver和PC中虚...

a18373279153 ⋅ 05/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

20.zip压缩 tar打包 打包并压缩

6月25日任务 6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩 6.5 zip压缩工具: zip支持压缩目录 zip压缩完之后原来的文件不删除 不同的文件内容其实压缩的效果不一样 文件内有很多重复的用xz压...

王鑫linux ⋅ 4分钟前 ⋅ 0

double类型数据保留四位小数的另一种思路

来源:透析公式处理,有时候数据有很长的小数位,有的时候由在四位以内,如果用一般的处理方法,那么不足四位的小树会补充0到第四位,这样子有点画蛇添足的感觉,不太好看。所以要根据小数的...

young_chen ⋅ 11分钟前 ⋅ 0

Python 优化 回溯下降算法

使用sympy构造表达式,实现回溯下降算法 画出函数图像,先使用暴力搜索,找到最小值约为2.5左右 然后选定初始点,开始进行回溯搜索,下降方向为负梯度方向 下降的误差与步数大致呈现下面的状...

阿豪boy ⋅ 15分钟前 ⋅ 0

Django配置163邮箱出现 authentication failed(535)错误解决方法

最近用Django写某网站,当配置163邮箱设置完成后,出现535错误即:smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed') Django初始配置邮箱设置 EMAIL_HOST = "smtp.1...

陈墨轩_CJX ⋅ 17分钟前 ⋅ 0

用接口模拟可伸缩枚举(34)

1、枚举的可伸缩性最后证明都不是什么好点子 扩展类型的元素是基本类型实例,基本类型的实例却不是扩展类型的元素,很混乱 目前还没有很好的方法来枚举基本类型的所有元素,及其扩展 可伸缩性...

职业搬砖20年 ⋅ 20分钟前 ⋅ 0

Ubuntu18.04 IDEA快捷键无法使用

IDEA默认的回退到上一视图的快捷键是Ctrl + Alt + Left,在ubuntu中这个快捷键被占用了,在16.04中可以在界面中取消这个快捷键,但是18.04就看不到了,可以使用以下命令解决 gsettings set ...

Iceberg_XTY ⋅ 24分钟前 ⋅ 0

如何解决s权限位引发postfix及crontab异常

一、问题现象 业务反馈某台应用服务器,普通用户使用mutt程序发送邮件时,提示“postdrop warning: mail_queue_enter: create file maildrop/713410.6065: Permission denied”,而且普通用法...

问题终结者 ⋅ 37分钟前 ⋅ 0

Unable to load database on disk

由于磁盘空间满了以后,导致zookeeper异常退出,清理磁盘空间后,zk启动报错,信息如下: 2018-06-25 17:18:46,904 INFO org.apache.zookeeper.server.quorum.QuorumPeerConfig: Reading co...

刀锋 ⋅ 56分钟前 ⋅ 0

css3 box-sizing:border-box 实现div一行多列

<!DOCTYPE html><html><head><style> div.container{ background:green; padding:10px 10px;}div.box{box-sizing:border-box;-moz-box-sizing:border-box; /* Fir......

qimh ⋅ 今天 ⋅ 0

Homebrew简介和基本使用

一、Homebrew是什么 Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径...

说回答 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部