rr来debug你的C/C++程序(Linux)

news2024/11/26 10:15:37

如何用rr来debug你的C/C++程序(Linux)

想象一下如果你的程序某时会崩溃,但是不能稳定复现,你会如何debug它?

用传统debugger面临的问题就是你不知道这次运行的时候能不能复现,你猜测可能某段代码出现了问题,所以进行了一番检查。但如果最后不能复现的话,刚刚所做的工作就是无用的。gdb通过一个反向调试的功能解决了这个问题。但是gdb的反向调试代价很大,在大型项目上运行很吃力。Bug出现的几率高还好,但如果出现的概率是1/100,甚至1/1000呢?

要么就用大量printf,通过print出数据来进行debug,好处是重复运行程序的成本较低,可以写个脚本,反复可以多次尝试,直到程序崩溃,然后反回去看log。但也有一样的问题就是效率不高,哪怕复现成功了,也很有可能现有的printf并不能解决问题,需要加更多的printf,又要反复运行程序来复现。

rr的出现就是来解决上面提到的问题。rr是一个debugger,通过记录程序运行时的状态,来提供一个可以反复反向调试的debug环境。

rr的优点

  • 比gdb的反向调试更成熟,并且有更少的消耗

  • 对多线程进程友好,可以只调试某个进程

  • 支持gdb的指令

安装

推荐按着官方文档来进行本地编译,然后安装。请注意rr现在只能在Linux上运行并且对CPU有一定的要求,具体要求请看官方文档。

ubuntu快速安装

cd /tmp
wget https://github.com/rr-debugger/rr/releases/download/5.5.0/rr-5.5.0-Linux-$(uname -m).deb
sudo dpkg -i rr-5.5.0-Linux-$(uname -m).deb

操作系统配置

需要 Linux 内核 3.11 或更高版本(检查uname -r)。

/proc/sys/kernel/perf_event_paranoid必须 <= 1 rr 才能有效工作(即能够使用perf计数器)。一些发行版将其设置为 2 或更高,在这种情况下,您需要将其设置为 1 或使用rr record -n,这很慢。通过运行临时更改设置

$ sudo sysctl kernel.perf_event_paranoid=1

基础使用方法

使用rr总共分成两步

  1. 第一步是rr record - 运行程序,并且记录下程序运行时的状态。

  2. 第二部是rr replay - 回放记录好的程序。

实例

  #include <cstdio>
  #include <thread>
  #include <stdlib.h>
​
  void inc(int& x, int id) {
    id = id + 1; //这一行有点多余,主要是为了展示rr的reverse-continue 功能
    if (x == 2 && id == 3) {
      abort();
    }
    ++x;
    printf("x=%d\n", x);
  }
​
  int main () {
    int x = 0;
    std::thread t1(inc, std::ref(x), 1);
    std::thread t2(inc, std::ref(x), 2);
    std::thread t3(inc, std::ref(x), 3);
    std::thread t4(inc, std::ref(x), 4);
​
    t1.join();
    t2.join();
    t3.join();
    t4.join();
  }

上面这个程序启动了多个线程,会在当t2这个线程运行时x == 2 && id == 3的时候崩溃。因为线程运行的顺序是不可控的,所以这个程序并不会总是崩溃。

我们首先编译上面这个程序

  • 运行g++ -g main.cpp -o main -lpthread。编译好后,我们得到了 main 这个二进制文件。

然后我们来record

  • 这里我们运行rr record --chaos ./main

rr record --chaos ./main
  • 正常情况我们 rr record ../main 就可以了,但我们这里用了--chaos让rr可以更加随机的进行调度,从而增加复现这个bug的概率。

  • 我们还可以自动化这个步骤通过while rr record --chaos ./main; do :; done 来反复运行这个程序,这个while循环会在main崩溃的时候自动结束。

while rr record --chaos ./main; do :; done 

我这次运行了32次才成功复现这个崩溃。

rr 会把每次的记录存放在~/.local/share/rr里面,这时候我们ls看一下。

 

每个main-<数字>就是rr存放的记录,rr支持我们回放每一个记录,rr replay 默认会回放最新的那个,我们直接rr replay就好了。

上图就是rr debugger的样子。因为rr使用的是gdb protocol,所以我们可以运行各种gdb的指令。

我们接下来利用gdb的continue指令 (continue指令会让程序一直运行,直到程序结束,程序崩溃,或者命中断点),让程序自动停在崩溃的地方。

我们看到rr的回放也print出了x=1 和 x=2, 跟当时运行时是完全一样的。这里我们输入bt可以检查call stack的内容。可以看到abort()是让程序崩溃的原因。

 

输入up 2,来到inc()的这个frame。再配合list,就可以看到具体造成崩溃的代码。这里我们输入 p id 可以看到当前id的数据,确实是id == 3造成了崩溃。

这时候我们需要寻找为什么id是3的原因,这段代码很明显是由id = id + 1造成的,但是假如我们不知道是哪里造成id变化,我们可以输入watch -l id 来观察这个变量,再通过rc来回到造成变化的代码。

注意这里我们输入了rc两次,第一次rc的时候,rr收到了程序崩溃的信号,所以停止了,我们需要再输入一次让它继续。rr自动就帮我们回到了id变化的这一行代码,这时候我们再看p idid就是2了。通过追逐id的变化,我们就可以对代码进行必要的修改了。

这就是rr的能力,不单单我们返回到了这一行代码,连程序相应的状态都回到了这个时刻。rr的强大之处就是给我们的一种回到过去的能力。

ROS下使用方式补充

调试ROS节点方式如下:

rosrun --prefix 'rr record' you_ros_node

rosrun --prefix 'rr record --chaos' teleop_twist_keyboard teleop_twist_keyboard.py

例如调试小乌龟:

➜  ~ rosrun --prefix 'rr record' turtlesim turtlesim_node 
On Zen CPUs, rr will not work reliably unless you disable the hardware SpecLockMap optimization.
For instructions on how to do this, see https://github.com/rr-debugger/rr/wiki/Zen
rr: Saving execution to trace directory `/home/efsz/.local/share/rr/turtlesim_node-1'.
[ INFO] [1668656353.548471340]: Starting turtlesim with node name /turtlesim
[ INFO] [1668656353.562282765]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

柔性制造物料抓取及加工系统设计

目 录 摘 要 I Abstract II 1 绪论 1 1.1 选题背景及意义 1 1.2 国内外研究现状 2 1.3六自由度并联机器人介绍 3 1.4研究主要内容 6 1.4.1主要设计要求 6 1.4.2技术参数 7 2柔性制造物料抓取及加工系统的结构及工作原理 8 2.1 并联运动机构概述 8 2.2 六自由度并联加工机器人总…

LTR (Learning to Rank): 排序算法 poitwise, pairwise, listwise常见方案总结

目录1 Learing to Rank介绍2 The Pointwise Approach3 The Pairwise Approach3.1 RankNet4 The Listwise Approach4.1 直接优化评测指标4.1.1 LambdaRank4.1.2 LambdaMART4.2 定义Listwise损失函数4.2.1 ListNet4.2.2 ListMLE5 排序评估指标5.1 Mean Reciprocal Rank (MRR)5.2 …

46-文本编辑器及文本处理

46-文本编辑器及文本处理常见文本编辑器linux文本编辑器介绍Linux文本编辑器-emacsLinux文本编辑器-nanoLinux文本编辑器- geditLinux文本编辑器- keditLinux文本编辑器- viLinux文本编辑器- vim使用vim编辑器vim基础操作-打开文件vim基础操作-移动光标vim基础操作–数据操作vi…

解决——》CommunicationsException:Communications link failure

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 解决——》CommunicationsException:Communications link failure1、操作2、现象3、原因4、解决1&…

大一新生HTML期末作业 学生个人网页设计作业 HTML5响应式个人简历网站模板 web前端网页制作课作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【linux】登录审计

linux登录审计 桥接模式配置互联 VMware的“虚拟网络编辑器” 输入’nm-connection-editor’&#xff0c;配置以太网 为以太网连接配置网卡 配置ipv4 互ping ssh远程登录 ssh -l 用户名 ip地址exit退出ssh远程 [alexalexw-device ~]$ ssh -l alex 1.1.1.2 The au…

数据挖掘——RFM客户价值模型及航空公司客户分析实例

引言 背景信息时代的来临使得企业营销焦点从产品转向了客户&#xff0c;客户的管理关系成为企业的核心问题。客户的关系管理问题是客户分群。通过客户分群&#xff0c;进而区分无价值客户和高价值客户。高价值客户代表他们的消费会给企业带来利益最大。企业需要针对不同类别的…

易基因|病毒抗性:全基因组DNA甲基化揭示草鱼年龄相关病毒易感性的表观遗传机制

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2022年06月02日&#xff0c;淡水生态与生物技术国家重点实验室&#xff08;中国科学院水生生物研究所&#xff09;何利波副研究员为第一作者和通讯作者&#xff0c;汪亚平研究员为共同通…

智慧市政解决方案-最新全套文件

智慧市政解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧市政全套最新解决方案合集一、建设背景 随着中国经济的快速发展&#xff0c;城市化步伐不断加快&#xff0c;为了适应城市发展与管理的需求&#xff0c;解决城市市政管理过程中的问题&#…

PDPS软件:机器人控制输送带运行虚拟仿真操作方法

目录 概述 旋转台设备运动机构介绍 旋转台设备模型导入与安装 旋转台设备操作创建 机器人控制旋转台设备离线程序命令添加 仿真运行 概述 旋转台也是工业机器人生产线中常用的外围设备&#xff0c;工件安装在旋转台的夹紧机构上&#xff0c;旋转台通过旋转实现工作位置的…

【Linux】进程地址空间

文章目录一、前言二、什么是进程地址空间三、进程地址空间如何进行管理四、为什么会存在进程地址空间五、进程地址空间区域的严格划分一、前言 学习Linux系统编程一共要翻越三座大山 – 进程地址空间、文件系统以及多线程&#xff0c;这三部分内容很难但是非常重要&#xff1b…

[附源码]Python计算机毕业设计java高校社团管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

GitCode / 1024程序员开源挑战赛(10.23-11.14)

目录 csdn也有云计算了 这个挑战赛&#xff0c;主要是向大家宣布了&#xff0c;咱们csdn也有自己的云计算了&#xff01; 比较有特色的 云容器 云IDE 猿如意 也是有个有特色的工具&#xff0c;可以试用下。​编辑 问题 csdn也有云计算了 这个挑战赛&#xff0c;主…

0097 弗洛伊德算法,马踏棋盘算法

import java.util.Arrays; /* * 弗洛伊德算法 * 1.和迪杰斯特拉算法一样&#xff0c;弗洛伊德算法也是一种用于寻找给定的加权图中顶点间最短路径的算法 * 2.迪杰斯特拉算法用于计算图中某一顶点到其他顶点的最短路径 * 弗洛伊德算法计算图中各个顶点之间的最短路径 * …

IT就业专业为什么要选择大数据技术应用?

IT就业专业为什么要选择大数据技术应用&#xff1f;目前大数据领域从业人员的薪资高涨幅空间大&#xff0c;大数据人才供不应求。各大数据开发方向&#xff0c;数据挖掘、数据分析和机器学习方向&#xff0c;大数据运维和云计算方向。 一、大数据技术应用发展前景好&#xff1…

物联网协议MQTT

物联网协议MQTT 1.MQTT简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上&#xff0c;是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议&#xff0c;为此&#xff0c;它需要一…

必考设计模式

文章目录一、单例模式&#xff08;创建型&#xff09;1、饿汉式2、懒汉式3、双重检验锁&#xff08;DCL&#xff09;4、sync.once实现单例二、工厂模式&#xff08;创建型&#xff09;1、简单工厂模式2、工厂方法模式3、抽象工厂模式&#xff08;暂时不写&#xff09;三、装饰模…

高通SDX12:SFE(shortcut-fe)软加速驱动效果调测

背景 USB转PHY RTL8153不支持高通IPA硬加速,所以采用SFE软加速 调试设备为基于Cat.6通信模组的整机 SFE软加速前:UXM环境实际测速100Mbps,设备内部sirq 87% SFE软加速驱动调测 SFE驱动代码路径:sdx12-ap\shortcut-fe\shortcut-fe SFE驱动编译文件路径:sdx12-ap\poky\m…

阿里云ACP考试内容是什么?考试时间是什么时候?

对于现在的人来说&#xff0c;网络就是帮助自己了解世界的好帮手、就是让自己生活得更方便的好工具&#xff0c;这样一来&#xff0c;市场就需要大量的人才来满足需求&#xff0c;相对应的岗位也逐渐增多。于是就有大批的大学生在填报志愿的时候&#xff0c;选择IT专业&#xf…

使用Docker发布部署C# .NET core WebApi到服务器

1、启用Docker支持 如果我们使用vs2022新建WebApi项目的时候需要勾选 启用Docker &#xff1a; 如果没有勾选或者使用VS019创建的项目&#xff0c;可以在项目右键 添加 docker支持 2、发布运用程序 接下来开始发布程序&#xff0c;右键点击项目 发布 提示在哪里发布内容&am…