文章目录

  • 前言
  • 测试代码
  • 代码编译
  • step/finish组合
  • step/return组合
  • 总结

前言

说实话平时在Windows平台上开发,gdb调试用的并不是很多,但是一些在linux平台才会出现的BUG,或者在linux运行时宕机产生了core文件,这些还是需要使用gdb调试的,之前的文章《linux环境下服务器程序的查看与gdb调试》列举了常用的gdb命令,基本上调试一些core文件和简单bug使用这些命令足以了,但是新的需求总是会出现。

新的需求也很常见,就是跳进一个函数,调试一部分代码后还要跳出这个函数,一般情况就是这个函数特别长,调试前几行已经明白函数的逻辑和用意,如果使用 next 命令逐行运行需要花费较多时间,所以需要跳出函数回到调用的位置,这两个操作在Visual Studio中的快捷键分别是F11Shift+F11,使用起来非常的方便,其实在gdb调试的过程中也有对应的命令,分别是step(s)finish(fin),括号中的内容为命令的简写,此外还有一个return命令也可以使函数返回,接下来可以看一下它们的区别。

测试代码

测试的代码很简单,只需要写一个简单的函数,并且在主函数中调用这个函数即可,代码如下:

#include <iostream>
using namespace std;int son_func()
{int a = 100;int b = 1;return a + b;
}int main()
{int i = 10;cout << i << endl;int result = son_func();cout << result << endl;
}

代码编译

编译代码时只需要注意一点,那就是加上-g选项,否则可能会影响调试:

albert@localhost#11:56:18#/home/albert/gdbtest]$g++ -g stepfinish.cpp -o stepfinishtest

step/finish组合

这个组合不会影响函数的运行结果,简单的调试过程如下:

[albert@localhost#11:32:17#/home/albert/gdbtest]$gdb stepfinishtest
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6)
Copyright (C) 2010 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/albert/gdbtest/stepfinishtest...done.
(gdb) start
Temporary breakpoint 1 at 0x400809: file stepfinish.cpp, line 13.
Starting program: /home/albert/gdbtest/stepfinishtestTemporary breakpoint 1, main () at stepfinish.cpp:13
13      int i = 10;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64 libstdc++-4.4.7-23.el6.x86_64
(gdb) n
14      cout << i << endl;
(gdb) n
10
16      int result = son_func();
(gdb) step
son_func () at stepfinish.cpp:6
6       int a = 100;
(gdb) finish
Run till exit from #0  son_func () at stepfinish.cpp:6
0x0000000000400831 in main () at stepfinish.cpp:16
16      int result = son_func();
Value returned is $1 = 101
(gdb) n
18      cout << result << endl;
(gdb) n
101
19  }
(gdb) c
Continuing.Program exited normally.
(gdb)

首先使用start命令启动程序,然后使用next(n)命令让程序运行到调用函数son_func()所在的行,使用step命令进入函数,我们看到a的值为100,假设这时我们想回到这个函数被调用的位置,直接敲finish命令就可以,函数完整的执行并返回结果101,最后连续执行next(n)命令,程序正常退出,整个过程只是调试查看数据,并没有改变程序运行结果。

step/return组合

这个组合有可能会影响函数的运行结果,具体要看return命令使用的位置和返回的参数:

[albert@localhost#11:53:42#/home/albert/gdbtest]$gdb stepfinishtest
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6)
Copyright (C) 2010 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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/albert/gdbtest/stepfinishtest...done.
(gdb) start
Temporary breakpoint 1 at 0x400809: file stepfinish.cpp, line 13.
Starting program: /home/albert/gdbtest/stepfinishtestTemporary breakpoint 1, main () at stepfinish.cpp:13
13      int i = 10;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64 libstdc++-4.4.7-23.el6.x86_64
(gdb) n
14      cout << i << endl;
(gdb) n
10
16      int result = son_func();
(gdb) step
son_func () at stepfinish.cpp:6
6       int a = 100;
(gdb) n
7       int b = 1;
(gdb) return 119
Make son_func() return now? (y or n) y
#0  0x0000000000400831 in main () at stepfinish.cpp:16
16      int result = son_func();
(gdb) n
18      cout << result << endl;
(gdb) print result
$1 = 119
(gdb) c
Continuing.
119Program exited normally.
(gdb)

首先同样使用start命令启动程序,然后使用next(n)命令让程序运行到调用函数son_func()所在的行,使用step命令进入函数,我们看到a的值为100,这时再敲入next(n)命令让程序运行一步,可以看到b的值为1,假设这时我们想返回一个自定义值而不返回a+b的结果,可以直接敲命令return 119,表示直接返回119这个值,再打印返回值变量result发现是值119,跳出函数的同时,程序运行结果也已经被我们改变了。

总结

  1. gdb中跳入函数的命令是step,相当于Visual Studio中的快捷键F11
  2. gdb中跳出函数的命令是finish,相当于Visual Studio中的快捷键Shift+F11,函数完整执行后返回
  3. gdb中还有一个直接返回的命令是return,它会跳过当前函数后面的语句直接返回,返回值可以自定义,紧跟在return命令后面即可

gdb调试程序时跳进函数和跳出函数相关推荐

  1. linux gdb 跳出函数,gdb调试程序时跳进函数和跳出函数

    文章目录 前言 测试代码 代码编译 step/finish组合 step/return组合 总结 前言 说实话平时在Windows平台上开发,gdb调试用的并不是很多,但是一些在linux平台才会出现 ...

  2. 使用gdb调试程序完全教程

    程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量. 本文将主要介绍linux下的强大调试工具是怎么完成这些工作的. 之所以要调试程序,是因为程序的运行结果和预期结果不 ...

  3. linux使用gdb调试程序完全教程

    转自 http://blog.csdn.net/gatieme 程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量.  本文将主要介绍linux下的强大调试工具是怎么完 ...

  4. gdb调试程序函数名为问号,什么原因?step by step解决方案

    gdb调试程序函数名为问号,什么原因?step by step解决方案 参考文章: (1)gdb调试程序函数名为问号,什么原因?step by step解决方案 (2)https://www.cnbl ...

  5. 用GDB调试程序(10)──查看运行时数据(1)-转

    在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是: print <expr>     p ...

  6. R语言使用plot函数和lines函数可视化线图(line plot)时、图之间的主要区别是由选项type产生的、type参数常用参数说明、不同type生成的可视化图像对比

    R语言使用plot函数和lines函数可视化线图(line plot)时.图之间的主要区别是由选项type产生的.type参数常用参数说明.不同type生成的可视化图像对比 目录

  7. 用户自定义的Javascript函数名字与内置函数或宿主函数名字相同时产生的问题。...

    原文出自:http://www.cnblogs.com/JiangHuakey/archive/2012/04/12/2443946.html 当用户定义的函数名字与内置函数或宿主函数名字相同时,如果 ...

  8. php实现 求int型数据在内存中存储时1的个数(函数都可自己实现)

    php实现 求int型数据在内存中存储时1的个数(函数都可自己实现) 一.总结 一句话总结:函数我们自己都可以实现,尤其是很多基础函数,没有工具的时候自己写. 1.php进制转换函数? base_co ...

  9. C++ - 模板函数须要类型转换时使用友元(friend)模板函数

    模板函数须要类型转换时使用友元(friend)模板函数 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24357301 非模板函数 ...

最新文章

  1. 高效程序猿之(四)VS2010其他技巧
  2. ossfs工具将OSS挂载到阿里云linux系统目录例子
  3. python链家网高并发异步爬虫asyncio+aiohttp+aiomysql异步存入数据
  4. 「Apollo」百度Apollo感知模块(perception)红绿灯检测代码完整+详细解析
  5. java接口常见问题分析_常见问题 - Apache ServiceComb
  6. 命令行cd到_前端(只)需要掌握这些命令行(就还行了)
  7. 组态王调用mysql存储过程_组态王与数据库通讯
  8. c++ qt获取电脑的内存_QT开发(十四)——QT绘图系统
  9. 云计算教程学习入门视频课件:常用数据库排名
  10. 接口如何保证幂等性的解决方案
  11. MySQL的条件判断函数
  12. java模拟网银登录_Java模拟网上银行业务
  13. Smobiler资料准备与环境搭建——C# 或.NET Smobiler实例开发手机app(一)
  14. 计算机管理格式化硬盘,如何将电脑硬盘格式化?笔记本硬盘格式化的操作方法...
  15. 云存储——115网盘
  16. 阿里云智能编码插件Cosy,让你的开发过程既高效又轻松
  17. for循环次数太多的时间优化_matlab for循环过大程序运行慢解决方案
  18. 忍者理论谈《嗜血边缘》如何做出独特的4V4战斗音效
  19. 盛世传承“富三代”品牌让你的家族基业长青
  20. 使用Navicat复制MySQL数据库

热门文章

  1. Windows XP自动登录 auto login
  2. 13 路由器RIP动态路由配置
  3. 洛谷P1007——独木桥 解法 (C++)
  4. Co Attention注意力机制实现
  5. 人关节软骨细胞的体外培养
  6. 临港新片区人才住房政策办事指南
  7. 求伯君的问题还是记者的问题?
  8. IOT设备配网绑定通讯流程
  9. 智慧停车成为了改善停车环境、满足停车需求的“香饽饽”
  10. c语言万年历算天干地支,万年历计算 之 干支