0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

rr と vscode でデバッグしてみる

Last updated at Posted at 2021-09-03

#はじめに
rrを使ったデバックを実際に試してみる

#前準備

ワーキングフォルダに移動
$ cd <work directory>
ソースコードを取得
$ git clone https://github.com/aRaikoFunakami/rr_test.git
$ cd rr_test/
コンパイル
$ gcc -g -O0 -pthread a.c
vscodeを起動
$ code . &

#アプリの実行を記録

実行1
$ rr record ./a.out
rr: Saving execution to trace directory `/home/raiko/.local/share/rr/a.out-49'.
100/array[0] = 10
100/array[1] = 5
100/array[2] = 3
100/array[3] = 2

1回目の実行では不具合は発生しなかった
(タイミングによって発生する不具合のため1回目の実行でエラーが発生する場合もある)

実行2
rr record ./a.out
rr: Saving execution to trace directory `/home/raiko/.local/share/rr/a.out-50'.
100/array[0] = 10
100/array[1] = 5
Floating point exception

2回目の実行では Floating point exception が発生

このようにタイミングイシューで問題が発生する不具合は再現が難しいのだが、今回はrrで実行を記録しているので不具合を再生することができる。

#不具合の再生

再生の準備
$ rr replay -s 50505 -k

vscode で rr に接続して再生する
1.png
再生するとExceptionが37行目で発生していることがわかる
例外の発生は array[2] の値が 0 であるため、0除算を実行してしまっているため
2.png

#デバッグ
どこで array[2] の値が 0 に設定されたのかを確認していく
30行目にブレークポイントを設定
4.png
DEBUG CONSOLE-exec rc (-exec reverse-continue) で巻き戻す
3.png
30行目に戻るとarray[2]=30であることが確認できる
別スレッドで実行される thread_funcarray[2]の内容が書き換えられていると目星がつく
5.png
20行目にブレークポイントを設定して Continue
6.png
20行目まで実行されたときr=2であり、array[2]=0が実行されることが確認できる
これでFloating point exceptionの発生原因を特定した
7.png

#まとめ
rrでアプリの実行を記録しておくことで、タイミングイシューで発生する不具合を再生して再現できる。
不具合によっては再現するまでに何時間、何日もかかるものも存在するが、rrで実行を記録しておくことで不具合を再現する時間を大幅に短縮可能である。
また、例外エラーが発生した場所から巻き戻し実行することで、不具合の原因となった場所の特定することも比較的容易となることが確認できた。

#関連記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?