昨天遇到一个很奇怪的问题,如下:

按照理论,最后*p的值应该是99,不知为什么是15了,所以今天记录用gdb调试的过程,并熟悉gdb的使用。

(调试过程参考:http://www.cnblogs.com/hankers/archive/2012/12/07/2806836.html)

开始:

1.

2.(用list从第1行开始列出源码)

3.(一次只列10行,如果要从第11行开始继续列源代码可以输入list)

4.(也可以什么都不输直接敲回车,gdb提供了一个很方便的功能,在提示符下直接敲回车表示重复上一条命令。)

5.(gdb的很多常用命令有简写形式,例如list命令可以写成l,要列一个函数的源代码也可以用函数名做参数:)

6.(退出gdb环境)

7.(现在将niuke.cpp改名,然后gdb就列不出源码了)

说明:gcc-g选项并不是把源代码嵌入到可执行文件中的,在调试时也需要源文件。

8.(源码文件恢复,重新开始)

gdb停在main函数中变量定义之后的第一条语句处等待我们发命令,gdb列出的这条语句是即将执行的下一条语句。

9.(我们可以用next命令(简写为n)控制这些语句一条一条地执行)

说明:用n函数f()中的结果一下就打印出来了

10.(现在用start重新开始,用step命令(简写s)进入f()中去跟踪执行)

现在进入了f()函数。

11.(在函数中有几种查看状态的办法,backtrace命令(简写为bt)可以查看函数调用的栈帧)

可见当前f()是被main()调用的,传入指针p传给ret=0xbfffee94

12.(查看当前f()函数内局部变量的值i locals 或者info locals)

13.(如果想查看main函数当前局部变量的值也可以做到,先用frame命令(简写为f)选择1号栈帧然后再查看局部变量,i locals, info locals)

14.(继续运行,然后用p+变量名查看变量的值)

这里......$5,$6,$7,$8......分别保存了查看的中间值:

未执行*ret = &a时:

ret: 0xbfffee94(为&p)  *ret:0xbfffef54(p)  **ret:-1073745577

执行*ret = &a后:

ret: 0xbfffee94  *ret:0xbfffee68 = &a:0xbfffee68(值为99)  **ret:99(等于a)

15.(finish命令让程序一直运行到当前函数结束)

返回值是ret=0xbfffee94(&p)

16.(现在继续运行)

注意:A &p address : 0xbfffee94(&p未改变)  A p address : 0xbfffee68(与&a相同)  A *p value   : 15(奇怪的地方,为什么不是99)

17.(换一种思路:在执行 cout << "A &p address : " << &p << endl; 之前直接查看*p)

这里可以看到*p=99,是正确的,地址也与上面相同

18.(继续调试)

这里发现*p=15,被改变了。

 也就是说:在执行cout << "A &p address : " << &p << endl;后, *p的值被改变了,从99变为15了。

19.(连续输出两次*p)

这次发现第一次输出结果正常,第二次输出结果出错,那为什么呢?为什么呢?????

20.(知道原因了)

说明:a是一个局部变量,&a在f()执行完后就被系统回收了。f()中ret = &a 这一步,使得p=&a,所以最后p输出不对。

修改后:

这里终于正确了。

PS:前面一种情况,栈被系统回收,但是仍能输出一次99,我猜可能是系统还没来的及回收。。。

PSS:指针太容易出错了。。

Linux学习----gdb调试(指针的指针)的更多相关文章

  1. Linux学习--gdb调试

    一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或 ...

  2. Linux知识(5)----LINUX下GDB调试

    命令 解释 示例   file 加载被调试的可执行程序文件.因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample     r c Run的简 ...

  3. 一文入门Linux下gdb调试(二)

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...

  4. Linux学习——Gdb基本调试方法&&多线程调试

    1.Gdb的基本调试 示例代码 //e.c #include <stdio.h> void debug(char *str) { printf("debug info :%s\n ...

  5. Linux+eclipse+gdb调试postgresql源码

    pg内核源码解析课上用的vs调试pg源码, VS用起来确实方便,但是配置调试环境着实有点麻烦.首先得装个windows系统,最好是xp,win7稍微麻烦点:最好使用vs05,08和10也可以,但是比0 ...

  6. Linux下GDB调试简单示例

    这里介绍对文件first.c的基本GDB调试操作,只有部分命令,只是一个示例,运行环境为装有gcc编译器和gdb调试器的Linux环境,基本GDB调试命令如下表: 命令                 ...

  7. (十五)linux下gdb调试

    一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或 ...

  8. Linux嵌入式GDB调试环境搭建

    ======================= 我的环境 ==========================PC 端: CPU:x86_64, 系统:Ubuntu,IP:172.16.2.212开发 ...

  9. 一文入门Linux下gdb调试(一)

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 在window下我们习惯了IDE的各种调试按钮,说实话确实挺方便的,但到了Linux下,没有那么多的IDE ...

随机推荐

  1. 【转】解决keepalived正常启动但是虚IP(VIP)没有生成的问题

    如题所示,keepalived安装配置好之后能够正常启动,但是虚IP并没有生成.接着检查防火墙(iptables)发现也没有相关的限制.稍微郁闷了一下之后,查看了keepalived日志文件,这次成功 ...

  2. 用vue 写h5页面-摇一摇

    vue配合其他ui框架除了开发一个完整的web项目外,也有不少的项目做一些h5的活动页面开发.你的页面现在需要模拟微信的摇一摇动作. 项目环境: vue-cli 完成的一个项目 准备插件(包):依赖的 ...

  3. 51nod--1174 区间中最大的数 (RMQ)

    题目: 1174 区间中最大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j ...

  4. 【原创】大叔经验分享(22)securecrt连接自动断开

    securecrt一段时间没有操作连接就会自动断开(xshell就没有这个问题),提示信息为:信号灯超时时间已到,解决方法为: Options -- Session Options -- Termin ...

  5. Excel 恢复默认行高、列宽

    操作系统:Windows 10 x64 工具1:Excel 乱糟糟的! 选中需要调整的区域,选择菜单:开始 > 格式 > 自动调整行高 选中需要调整的区域,选择菜单:开始 > 格式 ...

  6. Debian Jessie升级至Stretch小记

    昨天Debian Stretch正式发布.为了尝新,昨天晚上便从Jessie升到了Stretch.结果,早上起来发现系统已无法进入X视窗环境,且NVIDIA的官方驱动无法成功编译和安装.看来,每次系统 ...

  7. 数字滚动特效 NumScroll

    1.使用前先引入jquery2.前端学习群:814798690 下载地址 https://github.com/chaorenzeng/jquery.numscroll.js.git 快速使用 1.引 ...

  8. .net core 2.x - 日志 - to elasticsearch - (2)

    你可能会有疑惑,怎么又来一偏,,,其实我也好奇,因为我已经忘记哪个能跑起来了,,,记忆中,这个好像是没问题的. 1.使用到的资源 关于es(elasticseach)在.net中的访问,可以参考es的 ...

  9. 一起学Python——数据类型详解

    和学习其他编程语言一样,首先要了解一门语言的数据类型. Python的数据类型有整型.浮点型.字符串.布尔型.日期时间类型.list列表.set集合.tuple元组.dict词典等. 1.整型 就是数 ...

  10. 20172328 2018-2019《Java软件结构与数据结构》第五周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第五周学习总结 概述 Generalization 本周学习了第九章:排序与查找,主要包括线性查找和二分查找算法和几种排序 ...