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平台 ...
随机推荐
- JavaScript Let 和 Const
来源:菜鸟教程:https://www.runoob.com/js/js-let-const.html JavaScript let 和 const ECMAScript 2015(ECMAScrip ...
- Reatful规范
Reatful规范 drf框架的作用 作用:写接口 什么是接口: URL(前后台信息交互的媒介) 明确了请求方式,提供对应后台所需参数,请求url链接可以得到后台的相应数据 怎么写接口: 参照某种规则 ...
- js里生成guid
function guid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { | , ...
- 导出excel模版
方法一: public void ToExcel(){ //第一步:获取模版物理路径 string file_1 = Server.MapPath("/Content/Excel/downE ...
- 无障碍开发(二)之ARIA role属性
role属性 role属性值 含义 HTML示意 说明 alert 表示警告 <p id="ajax_error_alert" role="alert"& ...
- angular项目中ts的配置编译tsconfig.json
{ "compilerOptions": { /* 基本选项 */ "target": "es5", // 指定 ECMAScript 目标 ...
- 解决:使用java连接Fastdfs,上传文件时报:SocketTimeOutException的问题
最近研究了下分布式存储Fastdfs,在centOS上配置完后,使用centOS或putty连接并上传图片,然后用浏览器读取storage server返回的URL,一切正常. 但是,使用eclips ...
- scrapy-redis 实现分布式爬虫
分布式爬虫 一 介绍 原来scrapy的Scheduler维护的是本机的任务队列(存放Request对象及其回调函数等信息)+本机的去重队列(存放访问过的url地址) 所以实现分布式爬取的关键就是,找 ...
- xml_dom4j
1.用dom4j解析文件 package Xml3; import java.io.File; import java.util.Iterator; import org.dom4j.Attribut ...
- django优化--ORM优缺点
谈Django绕不开ORM ORM : ORM概念,ORM特点,ORM 的优点,ORM 的缺点 orm : 对象关系映射 (Object Relational Mapping) ,用于实现面向对象编程 ...