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平台 ...
随机推荐
- Manacher模版
现在讲的也是一种处理字符串的方法,叫做Manacher,有点像“马拉车” 1179: [视频][Manacher]最长回文子串 时间限制: 1 Sec 内存限制: 128 MB提交: 209 解决 ...
- python多任务——协程的使用
使用yield完成多任务 import time def test1(): while True: print("--1--") time.sleep(0.5) yield Non ...
- JMX jconsole 的使用
JMX 1. JMX简单介绍 JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理正在运行中的Java程序.常用于管理线程, ...
- DockerFile 编译语法详解
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像,本小结首先介绍Dockerfile典型的基本结构和它支持的众多指令,并具体讲解通过这些指令来编写定 ...
- java代码--Date类获取当前时间-格式化输出
44:52 阅读数:2299 package cn.Date; import java.text.Format; import java.text.SimpleDateFormat; import ...
- Git复习(三)之分支管理、分支策略
创建合并删除分支 我们知道每次提交git都会将他们串成一条线,这条时间线就是一个分支.在git里这条时间线叫做主分支,即master分支 HEAD指向master,master指向最新的提交,所以,H ...
- postgresql 服务无法启动,日志中报如下错误
1.postgresql 服务无法启动,日志中报如下错误,磁盘空间足够. 无法找到来自源 PostgreSQL 的事件 ID 0 的描述.本地计算机上未安装引发此事件的组件,或者安装已损坏.可以安装或 ...
- Go项目目录管理
在Go的官网文档How to Write Go Code中,已经介绍了Go的项目目录一般包含以下几个: src 包含项目的源代码文件: pkg 包含编译后生成的包/库文件: bin 包含编译后生成的可 ...
- 第十三篇 JS 操作table表格
JS 操作table表格 这节课难度可能高一点,因为没有提前解释if判断.for循环.这节课是直接把这两样用上了,老师先简单介绍一下: if,判断语句,判断就很简单了嘛,假如说1=1(1等于1),当然 ...
- dedecms 多级栏目时,调用上级栏目名称和链接
{dede:field name='position' runphp='yes'} $tc="-"; //分隔符 $tw=$GLOBALS['cfg_list_symbol']; ...