GDB简单调试
最近在开始刷LeetCode,也开始在Linux上写代码,直接gcc编译,在调试的时候,需要用到gdb调试,所以在这里会不定期更新我学习到的gdb调试。
先编译成可执行文件
首先我们使用g++或者gcc编译成可执行文件,记得要加-g编译选项,表示生成调试信息,以便我们使用gdb调试。
开始调试
假设我们有一个 main.cpp文件,编译链接后生成了main这个可执行文件,进行调试:
gdb main
设置断点
开始调试后,我们可以设置断点:
break 23
这个表示对源文件的23行设置一个断点。以上两步设置完可以看到以下:
第一个框里面就是我们开始调试输入的命令,下面是生成的调试信息。第二个框里面就是我们输入的设置断点的命令了。
如果有多个源文件共同生成的,可以指定源文件的行数进行调试:
break main.cpp:23
其实,break也可以用b来简写。
使用:
info b
可以查看到设置的断点信息:
开始运行
现在我们来介绍设置完断点后,运行时候我们的调试规则,先看一下截图,是一个在调试的过程:
图可能看起来很不想继续看,相信我,我以前也是这种态度,但是请你继续看,因为自己输入的东西很少,几乎都是它生成的信息更多。我已经把我们写的命令用方框框起来了。
现在一个命令一个命令的解释。
run
顾名思义,就是开始执行程序,直到执行到断点停下来。 在图中我简写成了r即可.
step,next
这两个都是单步调试,不同在于,step是可以进入到执行的函数中间去调试,next是直接跳过这个函数的调试,直接到下一行。
list
从图中可以看到,在我调试到第16行的时候,再输入一个list,会输出以16行为中心的代码。没错,list就是展示我们调试信息附近的代码。
printf
在图中我也是简写成p,都是可以的。可以明确看到,我们可以使用
p 变量名
来打印一个变量值。图中nums[i]此时的值是3,int型,地址为0x607010
quit
简写为q,就是退出GDB调试。
finish
结束GDB调试。
总结
gdb | 可执行文件 |
---|---|
(gdb)start | 表示开始调试 |
(gdb) n | 表示执行下一步(不会进入函数) |
(gdb) step | 表示执行下一步(会进入函数) |
(gdb) b Line | 给第Line行设置断点 |
(gdb) b xx.cpp:Line | 给xx文件第Line行设置断点 |
(gdb) quit | 表示退出调试 |
(gdb) p 变量名 | 可以查看变量的值 |
(gdb) finish | 表示直接执行到当前函数结束 |
(gdb) list | 可以显示当前部分代码 |
(gdb) list Line | 可以显示Line行附近 |
(gdb) info b | 显示断点信息 |
(gdb) d num(显示信息中的断点编号) | 删除指定断点 |
(gdb) c (continue) | 跳到下一个断点 |
(gdb) ptype 变量名 | 查看变量类型 |
(gdb) set argv[i]=x | 设置参数值 |
(gdb) display 变量 | 跟踪变量,看每一步的值 |
(gdb) info display | 显示跟踪信息 |
(gdb) undisplay num(显示信息中的编号) | 放弃跟踪值 |
(gdb) break Line if i==6 | 条件断点。在Line行设置断点,并运行到i=6时停下来 |
GDB简单调试的更多相关文章
- gdb简单调试~core文件
1.打开终端,进入项目目录,输入ulimit -a ,可以看core文件大小设置(第一行),若为0, 则没有打开core dump设置. 2.ulimit -c unlimited ,core文件大小 ...
- GDB 程序调试简单实践
用了好久的GCC/G++ 却一直都没用过GDB调试过程序,有时程序不是非常大,一般有错,直接看编译器编译结果就几乎相同知道错在哪儿了,或者使用codeblocks单步调试,甚至回到windows以下调 ...
- 源码级别gdb远程调试(实现OS简单内核)
最近在学着编写一个操作系统的简单内核,需要debug工具,我们这里使用gdb来进行调试,由于虚拟机运行和本机是两个部分,所以使用 gdb 的远程调试技术,这里对 gdb 常见调试以及远程调试方式做一个 ...
- GDB+GDBServer调试Linux应用程序
参考:http://blog.csdn.net/shanghaiqianlun/article/details/7820401 一.gdb+gdbserver总体介绍 远程调试环境由宿主机GDB和目标 ...
- GDB常用调试命令以及多进程多线程调试
http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令 1.list命令 list linenum 显示程序第l ...
- 基于TQ2440和Qemu的GDB+串口调试(1)
作者 彭东林 pengdonglin137@163.com 平台 TQ2440 + Linux-4.10.17 Qemu(vexpress-ca9) + Linux-4.10.17 概述 下面 ...
- Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动
姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...
- 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案
基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...
- gdb各种调试命令和技巧
陈皓:用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台 ...
随机推荐
- CentOS7通过YUM安装MySQL5.6
检查系统中的 MySQL,并删除现有的 Mysql 软件包. $ rpm -qa | grep mysql 这里如果没有返回任何东西证明没有安装任何 MySQL 相关的应用.如下图: 由于 cento ...
- 忘记虚拟机中Linux的登录密码解决办法
一.重启系统,在开机过程中,快速按下键盘上的方向键↑和↓.目的是告知引导程序,我们需要在引导页面选择不同的操作,以便让引导程序暂停. 2.使用↑和↓将选择行设置为第一行(背景高亮即为选中),按下键盘上 ...
- 自定义字段的设计与实现(Java实用版)
前言 自定义字段又叫做"开放模型",用户可以根据自已的需求,添加需要的字段,实现个性化定制. 使用自定义字段的目的,使用自定义字段解决哪些问题 如现有一套CRM系统,客户模块中客户 ...
- Java后端技术面试汇总(第五套)
1.Java相关 • 乐观悲观锁的设计,如何保证原子性,解决的问题:• char和double的字节,以及在内存的分布是怎样:• 对象内存布局,然后讲下对象的死亡过程?• 对象头,详细讲下:• syn ...
- Java APi 之 RMI远程方法调用
一.什么是RPC RPC全称是remote procedure call,即远程过程调用.它是一种协议,用于从远程计算机上请求服务. 例如有两台服务器A和B,A上的应用想要调用B上应用的方法,但是他们 ...
- dubbo学习笔记三(全注解)
完全用注解替换掉之前的部分配置文件 项目结构 下面给出服务的的部分代码 [DubboConfiguration] @Configuration @EnableDubbo(scanBasePackage ...
- 访问接口错误,com.netflix.client.ClientException: Load balancer does not have available server for client: panfeng-item-service
com.netflix.client.ClientException: Load balancer does not have available server for client: panfeng ...
- Linux下安装配置启动RabbitMQ
Linux版本:Centos 7RabbitMQ依赖erlang所以需要先安装erlang以及他需要的环境 安装erlang http://www.erlang.org/downloads 拿最新的版 ...
- C# 文件操作的一些小点子
1. 判断指定文件是否存在: bool System.IO.File.Exits(string fliePath);
- 【SDOI 2014】数表
题意 https://loj.ac/problem/2193 题解 显然就是求 $\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{m} \sigma_1(\gcd{ ...