【源码】RapidJSON 源码剖析(0.1):调试工具 GDB 的使用
【源码】RapidJSON 源码剖析(0.1):调试工具 GDB 的使用
正式开始源码阅读之前,有必要了解一下源码阅读中用到的调试工具 GDB。
GDB(GNU Debugger) 是一种可以运行在多种类 Unix 系统上的,可移植的,适用于多种编程语言的调试器。
(The GNU Debugger (GDB) is a portable debugger that runs on many Unix-like systems and works for many programming languages.)
GDB: The GNU Project Debugger 中对 GDB 有如下描述:
GDB 可以提供以下四种操作来帮助你捕获 bug:
• 启动你的程序,指定可能影响程序运行行为的内容。
• 让你的程序在指定的条件下停止。
• 当你的程序停止时, 检测你的程序发生的事。
• 改变你的程序的内容, 你可以纠正一个 bug 的影响,以便继续研究下一个 bug。
(gdb can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:
• Start your program, specifying anything that might affect its behavior.
• Make your program stop on specified conditions.
• Examine what has happened, when your program has stopped.
• Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.)
调试工具 GDB 的使用
0. 待调试程序
本文调试的样例程序来自于 RapidJSON 官方文档,具体源代码如下:
// rapidjson/example/simpledom/simpledom.cpp`
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
using namespace rapidjson;
int main()
{
// 1. 把 JSON 解析至 DOM。
const char* json = "{\"project\":\"rapidjson\",\"stars\":10}";
Document d;
d.Parse(json);
// 2. 利用 DOM 作出修改。
Value& s = d["stars"];
s.SetInt(s.GetInt() + 1);
// 3. 把 DOM 转换(stringify)成 JSON。
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
d.Accept(writer);
// Output {"project":"rapidjson","stars":11}
std::cout << buffer.GetString() << std::endl;
return 0;
}
1. 编译
要使编译生成的可执行文件带有可被 GDB 识别的调试信息,需要在编译时加上参数 -g。如:
g++ -g -std=c++11 simpledom.cpp -o simpledom.out
2. 用 GDB 启动你的程序
用 gdb <待调试软件名> 命令启动调试待调试软件。如:
gdb simpledom.out
3. 显示程序源码
当用 GDB 打开指定的程序后,可以用 list 或 l 命令查看该程序的源码。GDB: The GNU Project Debugger 9. Examining Source Files 对该命令有详细地介绍,这里摘录可能会用到的用法:
| command | description |
|---|---|
| list linenum | Print lines centered around line number linenum in the current source file. |
| list function | Print lines centered around the beginning of function function. |
| list first,last | Print lines from first to last. |
| list ,last | Print lines ending with last. |
| list first, | Print lines starting with first. |
| list filename:linenum | Print lines centered around linenum in the source file filename. |
| list filename:function | Print lines centered around the beginning of the function function in the file filename. |
如,显示当前文件的 20 到 23 行:
list 20, 23
输出如下:
4. 设置断点,查看断点和取消断点
设置断点是 break 或 b 命令,查看断点用 info break 或 info b 命令,删除断点用 delete 或 d 命令。具体用法如下表:
| command | description |
|---|---|
| break location | Set a breakpoint at the given location, which can specify a function name, a line number, or an address of an instruction. |
| break … if cond | Set a breakpoint with condition cond; evaluate the expression cond each time the breakpoint is reached, and stop only if the value is nonzero—that is, if cond evaluates as true.‘…’ stands for one of the possible arguments described above (or no argument) specifying where to break. |
| info break | Print a table of all breakpoints, watchpoints, and catchpoints set and not deleted. For each breakpoint, following columns are printed: Breakpoint Numbers, Type, Disposition, Enabled(‘y’) or Disabled(‘n’), Address, What. |
| delete breakpoint number | Delete the breakpoint specified by breakpoint number, If no argument is specified, delete all breakpoints. |
如,在 14 行和 18 行设置断点, 然后查看断点信息,最后取消 18行断点,再查看断点信息:
break 14
break 18
info break
delete 2
info break
输出如下:
5. 开始单步调试,下一步, 继续到下个断点,进入函数,跳出当前函数,查看变量值,查看变量类型。
start 命令从 main 函数开始单步调试。next 或 n 命令进入下一步。continue 或 c 命令继续执行程序到下一个断点。
step 或 s 命令进入函数内部, finish 跳出当前函数。
print <变量名> 或 p <变量名> 显示指定变量的值,ptype <变量名> 查看变量的类型。
如,
- 通过
start命令开始单步调试代码
- 进入下一步
- 查看变量
json的值和类型
- 在 14 行处设置一个断点
- 执行到下一个断点(14 行处)
- 跳转进
Parse函数
- 跳出
Parse函数
- 继续执行完整个程序
参考文献
【源码】RapidJSON 源码剖析(0.1):调试工具 GDB 的使用的更多相关文章
- Spring Boot 揭秘与实战 源码分析 - 工作原理剖析
文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...
- 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)
写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...
- [笔记] Ubuntu 18.04源码编译安装OpenCV 4.0流程
标准常规安装方法安装的OpenCV版本比较低,想尝鲜使用4.0版本,只好源码安装. 安装环境 OS:Ubuntu 18.04 64 bit 显卡:NVidia GTX 1080 CUDA:10.0 c ...
- 修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)
上周在定位问题时,发现Spring容器实例化Bean的时候抛出异常,为了查看更详细的信息,决定修改spring-context-4.0.2.RELEASE.jar中的CommonAnnotationB ...
- 大话Spark(6)-源码之SparkContext原理剖析
SparkContext是整个spark程序通往集群的唯一通道,他是程序的起点,也是程序的终点. 我们的每一个spark个程序都需要先创建SparkContext,接着调用SparkContext的方 ...
- EventBus源码解析 源码阅读记录
EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...
- ios源码-ios游戏源码-ios源码下载
游戏源码 一款休闲类的音乐小游戏源码 该源码实现了一款休闲类的音乐小游戏源码,该游戏的源码很简单,而且游戏的玩法也很容易学会,只要我们点击视图中的grid,就可以 人气:2943运行环境:/Xco ...
- C#UDP(接收和发送源码)源码完整
C#UDP(接收和发送源码)源码完整 最近做了一个UDP的服务接收和发送的东西.希望能对初学的朋友一点帮助. 源码如下: 一.逻辑--UdpServer.cs using System;using S ...
- android源码-安卓源码-Android源码下载-安卓游戏源码
android源码 高仿精仿金山手机卫士应用源码V1.2 高仿精仿金山手机卫士应用源码,该应用的级别实现了金山卫士的级别功能了,可以说跟现实中我们使用的金山卫士应用的功能几乎差不 人气:9286 ...
- zxing源码分析——QR码部分
Android应用横竖屏切换 zxing源码分析——DataMatrix码部分 zxing源码分析——QR码部分 2013-07-10 17:16:03| 分类: 默认分类 | 标签: |字号大中 ...
随机推荐
- 关于windows上pip安装报错
前言 因为我一直用linux,所以windows上的很多问题我都不怎么记录了,但是昨天去网吧,打算玩玩,遇到了安装第三方库报错,所以我有必要水一篇文章 为什么报错 其实python的第三方库很多不仅仅 ...
- Blazor和Vue对比学习(进阶.路由导航一):基本使用
Blazor和Vue都是单文件组件SPA,路由的实现逻辑非常相似,页面路径的改变都是组件的切换,但因为各自语言的特性,在实现方式上有较大差异. 一.安装 1.Vue:Router是Vue的一个插件.如 ...
- 4.4:Sqoop数据导入实验
〇.概述 1.拓扑结构 2.目标 使用sqoop工具将数据从mysql数据库导入到HDFS和Hbase 一.配置免密登录hdfs 三.导入到hdfs中 sqoop import --connect j ...
- 【每日一题】【链表&头插法&ASCII码】【链表&迭代器】2022年1月28日-NC1 大数加法
描述以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回. 思路:原生链表&头插法节点值 import java.util.*; public class Solution ...
- 《HTTP权威指南》– 3.HTTP方法和状态码
常见HTTP方法: 常用HTTP方法 描述 是否包含主体 GET 从服务器获取一份文档 否 HEAD 只从服务器获取文档的首部 否 POST 向服务器发送需要处理的数据 是 PUT 将请求的主体部分存 ...
- 模型驱动设计的构造块(下)——DDD
3. 领域对象的生命周期 每个对象都有生命周期,如下图所示.对象自创建后,可能会经历各种不同的状态,直至最终消亡--要么存档,要么删除.当然很多对象是简单的临时对象,仅通过调用构造函数来创建,用来做一 ...
- 05-Sed操作参数(II)
1 Sed操作参数 1.1 q 参数q表示跳离sed [address1]q sed执行跳离动作的时候,会停止输入pattern space数据,同时停止数据送到标准输出文件. 例1 对于文件执行sc ...
- C#动态创建对象过程
创建对象环境 获取当前应用程序集引用的类库详细信息,动态类也将调用此类库 obj类为项目动态编译时用到的模版类,主要提取其using信息用于动态生成的类使用 1 AssemblyName[]r ...
- DVWA系列2:SQL Injection
DVWA系列2:SQL Injection 前言 SQL 注入是比较常见的攻击类型,之前一直听说过,也尝试看过一些教程,但其中的单引号,字符串拼接等感觉有点抽象,不知道为什么要这么做.这次就使用 DV ...
- jQuery查找标签、节点操作、事件绑定、Bootstrap页面框架
jQuery查找标签.节点操作.事件绑定.Bootstrap页面框架 一.jQuery查找标签 1.各种选择器 1.基本选择器 $('#id') id选择器 $('.c1') 类(class)选择器 ...