收获新工具 rr,功能差不多就是在gdb上加一个倒放功能,网上一搜居然没有中文资料,所以记录一下。github地址:https://github.com/mozilla/rr
以下安装配置基于Ubuntu16.04,其余环境可以参考官方文档。
安装配置
安装依赖环境:
sudo apt-get install ccache cmake make g++-multilib gdb \
pkg-config coreutils python3-pexpect manpages-dev git \
ninja-build capnproto libcapnp-dev
下载rr编译:
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
su
echo 1 > /proc/sys/kernel/perf_event_paranoid
用法
rr record /path/to/my/program --args
rr replay
rr record
很有可能还会报错,按报错再配置一下。如果rr replay
进入了gdb
界面,那就算是大功告成了。
核心功能:
有了rr,gdb的 reverse-continue
、 reverse-step
、 reverse-next
、 reverse-finish
就都可以用了,reverse-xxx
就是运行方向是倒着的xxx。
reverse-continue
reverse-step
reverse-next
reverse-finish
官方推荐的用法是reverse-xxx
和watch
一起用。先watch
再reverse-continue
就可以来到变量修改的地方。value的Old和New是按reverse-continue
命令执行前后算的,执行前是Old value,执行后是New value。
watch最好加参数-l
,如果不加 -l
可能会非常缓慢或明显存在错误。
帮助:
运行rr -H
或rr --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
、 -g
、 when
还是不太懂,就不瞎说了,但是有这个倒放已经够香了。https://github.com/mozilla/rr/wiki/Usage
注意
rr不适用于amd。
rr不能安全地处理恶意代码。如果您在基于
seccomp
或命名空间的沙箱中记录运行不受信任的代码的应用程序,rr会故意在沙箱中打孔,以方便记录沙盒代码。从理论上讲,攻击者可以设计恶意代码,以识别何时在rr下运行该恶意代码,并利用这些漏洞逃脱沙箱。rr会影响性能。