收获新工具 rr,功能差不多就是在gdb上加一个倒放功能,网上一搜居然没有中文资料,所以记录一下。github地址:https://github.com/mozilla/rr

以下安装配置基于Ubuntu16.04,其余环境可以参考官方文档

安装配置

安装依赖环境:

1
2
3
sudo apt-get install ccache cmake make g++-multilib gdb \
pkg-config coreutils python3-pexpect manpages-dev git \
ninja-build capnproto libcapnp-dev

下载rr编译:

1
2
3
4
5
git clone https://github.com/mozilla/rr.git
mkdir obj && cd obj
cmake ../rr
make -j8
sudo make install

中间会报几个错,sudo + pip3安装缺少的包即可。

配置:

1.开启性能计数器,在虚拟机配置里找一下。

2./proc/sys/kernel/perf_event_paranoid<=1

1
2
su
echo 1 > /proc/sys/kernel/perf_event_paranoid
用法
1
2
rr record /path/to/my/program --args
rr replay

rr record很有可能还会报错,按报错再配置一下。如果rr replay进入了gdb界面,那就算是大功告成了。

核心功能:

有了rr,gdb的 reverse-continuereverse-stepreverse-nextreverse-finish 就都可以用了,reverse-xxx就是运行方向是倒着的xxx。

1
2
3
4
reverse-continue
reverse-step
reverse-next
reverse-finish

官方推荐的用法是reverse-xxxwatch一起用。先watchreverse-continue就可以来到变量修改的地方。value的Old和New是按reverse-continue命令执行前后算的,执行前是Old value,执行后是New value。

watch最好加参数-l,如果不加 -l可能会非常缓慢或明显存在错误。

帮助:

运行rr -Hrr --help

常规选项:

  • -V, --verbose:记录可能对用户不紧急的消息。
  • -M, --mark-stdio:在每条stdio输出行之前写入“当前事件编号”

记录器参数:

  • -c, --num-cpu-ticks=:允许任务在中断之前运行的“ CPU ticks”(当前无用的条件分支)的最大数量。
  • -e, --num-events=:在调度任务之前允许任务的最大事件数(系统调用进入/退出,信号,CPU中断等)。

在不同的调度参数下记录跟踪可以帮助重现不确定的错误。rr的调度程序是相对确定的。

重播参数:

  • -f, --onfork=:fork时调试
  • -p, --onprocess=:执行时进行调试
  • -g, --goto=:向前执行,直到在调试之前达到事件为止

具体的看官方讲的用法吧,我没看懂event具体是什么含义,所以-M-gwhen还是不太懂,就不瞎说了,但是有这个倒放已经够香了。https://github.com/mozilla/rr/wiki/Usage

注意
  • rr不适用于amd。

  • rr不能安全地处理恶意代码。如果您在基于seccomp或命名空间的沙箱中记录运行不受信任的代码的应用程序,rr会故意在沙箱中打孔,以方便记录沙盒代码。从理论上讲,攻击者可以设计恶意代码,以识别何时在rr下运行该恶意代码,并利用这些漏洞逃脱沙箱。

  • rr会影响性能。