GDB基础学习
GDB基础学习
- 要调试C/C++程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的-g参数可以做到这一点,比如:
gcc -g test.c -o test
GDB 的命令概貌
使用help命令
- 通过
gdb test启动gdb后,就进入了gdb的调试环境,就可以使用gdb 的命令开始调试程序了,gdb的
命令可以使用help命令来查看:

这里可以看到help命令只是列出了gdb命令的种类,如果要知道所有的命令可以输入
help all,也可以通过help <class>查看种类中的命令,或通过help <command>查看命令的帮助。比如我们可以通过
help breakpoints来查看断点的命令:

- 『需要注意』:gdb中的命令可以简写,如设置断点的break可以简写为b(当然,命令的前几个字符要标志着唯一的命令);在linux下,可以敲击两次TAB键来补齐命令的 全称,如果有重复的,gdb会把其列出来。比如输入b敲击两次TAB键:

基本命令
| 命令 | 解释 | 示例 |
|---|---|---|
| List(l) | 列出文件的代码清单 | (gdb) l |
| Printf(p) | 显示指定变量(临时变量或全局变量)的值。 | (gdb) p i (gdb) p nGlobalVar |
| Run(r) | 运行被调试的程序。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。 | (gdb) r |
| Continue(c) | 继续执行被调试程序,直至下一个断点或程序结束。 | (gdb) c |
| Breakpoint(b) | 1.函数断点: 在进入指定函数时停住。 2.行断点:在指定行号停住。 3.条件断点:break ... if ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。 4.临时断点:(tb 行号) |
(gdb) b main (gdb) b 8 (gdb) b if i=100 (gdb) tb 15 |
| Step(s) | 执行一行源程序代码,如果此行代码中有函数调用,则进入该函数; 相当于其它调试器中的“Step Into (单步跟踪进入)”。 |
(gdb) s |
| Next(n) | 执行一行源程序代码,此行代码中的函数调用也一并执行; 相当于其它调试器中的“Step Over (单步跟踪)”。 |
(gdb) n |
| Info(i) | 显示各类信息 | (gdb) i r |
| Backtrace(bt) | 打印函数调用堆栈 | (gdb) bt |
| Quit(q) | 退出gdb调试 | (gdb) q |
实例学习
我们用下面的代码来学习:
#include <stdio.h>
int func(int n)
{
int sum=0,i;
for(i=0; i<n; i++)
{
sum+=i; 9
}
return sum;
}
main()
{
int i;
long result = 0;
for(i=1; i<=100; i++)
{
result += i;
}
printf("result[1-100] = %d \n", result );
printf("result[1-250] = %d \n", func(250) );
}
首先vim一个test.c,再输入gcc -g test.c -o test进行编译,编译成功后输入gdb test启动gdb进行调试:

输入l列出源码,再敲击回车可以看到所有代码:

接下来在第16行通过b 16设置断点;通过b func在func函数处设置断点,info b可以查看断点信息如图:

输入r运行程序,会停到断点处;再输入n单条语句执行,可以看到循环在一条一条执行;为了快速一点,输入c直接把循环执行完:

我们也可以输入b 16 if i=50来设置条件断点,run之后可以看到程序停到了断点处,此时printf i的值为50:

GDB基础学习的更多相关文章
- gcc,gdb基础学习2
gdb调试: 源文件:test.cc >>g++ -g test.cc -o test.o 这里需要参数-g,因为接下来要使用gdb进行调试,生成目标文件test·o 因为需要将调试信息 ...
- gcc,gdb基础学习1
gcc: (1)gcc -O1 -S code.c 这里的-S可以的到code.c的汇编(只进行了预处理和编译这:两个阶段形成 了汇编代码code·s) (2)gcc -c code.c 这里 ...
- GDB基础知识
GDB 基础知识 GDB 基础知识 一.简介 支持命令补全功能 GDB 的调用与退出 二.GDB 的基本指令 1. run/r 2. break/b 3. info breakpoints 4. de ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- 如何从零基础学习VR
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...
- IOS基础学习-2: UIButton
IOS基础学习-2: UIButton UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...
- HTML5零基础学习Web前端需要知道哪些?
HTML零基础学习Web前端网页制作,首先是要掌握一些常用标签的使用和他们的各个属性,常用的标签我总结了一下有以下这些: html:页面的根元素. head:页面的头部标签,是所有头部元素的容器. b ...
- python入门到精通[三]:基础学习(2)
摘要:Python基础学习:列表.元组.字典.函数.序列化.正则.模块. 上一节学习了字符串.流程控制.文件及目录操作,这节介绍下列表.元组.字典.函数.序列化.正则.模块. 1.列表 python中 ...
- python入门到精通[二]:基础学习(1)
摘要:Python基础学习: 注释.字符串操作.用户交互.流程控制.导入模块.文件操作.目录操作. 上一节讲了分别在windows下和linux下的环境配置,这节以linux为例学习基本语法.代码部分 ...
随机推荐
- (整理)EF分页的实现
最近做一个小功能,需要数据分页,因为小框架使用的是EF,因此查询了一下EF的分页. EF分页主要用到了skip和take两个方法: GetListBy(lamda xxxxx).skip(PageSi ...
- Requests将verify设置为False后取消警告的方式
方法一 import requests import urllib3 urllib3.disable_warnings() resp = requests.get('https://www.***.c ...
- leetcode215
class Solution { public: int findKthLargest(vector<int>& nums, int k) { sort(nums.begin(), ...
- saltstack的封装和内网使用
0.客户端使用 linux:把linux的ragent文件夹拷贝到内网linux /opt目录下,运行初始化脚本 salt服务端:# @Master:"/opt/ragent/python/ ...
- This iPhone 6s is running iOS 11.3.1 (15E302), which may not be supported by this version of Xcode.
This iPhone 6s is running iOS 11.3.1 (15E302), which may not be supported by this version of Xcode.
- STS(eclipse)3.7.3新建项目报错:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)
烦人的版本兼容问题 没有使用sts3.7.3系统内嵌的maven3.3.3,调整为稍高版本的maven3.5.2,懒得修改配置了. 升级eclipse插件吧. Eclipse,Help -> I ...
- C#对接JAVA系统遇到的AES加密坑
起因对接合作伙伴的系统,需要对数据进行AES加密 默认的使用了已经写好的帮助类中加密算法,发现结果不对,各种尝试改变加密模式改变向量等等折腾快一下午.最后网上查了下AES在JAVA里面的实现完整代码如 ...
- 微信开发 invalid openid
微信开发时候测试号运行正常,换到正式号就会报invalid openid的错误. 看了微信问答系统里的答案,说是json格式的问题,但是我这边不是这个原因. 后来突然想到了,应该是AppId和AppS ...
- 前端 跨Area后Cookie无法访问
创建两个区域,一个是User,一个是Manage. User区域有两个页面,index1,和index2 User区域: index1:负责写入cookie index2:负责读取cookie Man ...
- AR涂涂乐
<1> 涂涂乐着色 https://blog.csdn.net/begonia__z/article/details/51282932 http://www.manew.com/blog- ...