Diary

Diary?

学生の研究日記だったらしいです。多分。

開発日記。

オススメの本(頂いた本):

いちばんあたらしいの2014 8/22 20:46

_22(Fri)

メモリ corruption の話。

中田さんに http://u64.rubyci.org/~chkbuild/ruby-trunk/log/20140821T220302Z.fail.html.gz みたいなエラーが出ていると指摘され、重い腰をあげる。どうやら、

./miniruby -I../trunk/lib -I. -I.ext/common ../trunk/tool/transcode-tblgen.rb -vo enc/trans/single_byte.c ../trunk/enc/trans/single_byte.trans

このコマンドでエラーが出ていることがわかったので、これを valgrind 上で実行すれば良かろう、と思い、

while make miniruby && rm enc/trans/single_byte.c -f && valgrind ./miniruby -I../trunk/lib -I. -I.ext/common ../trunk/tool/transcode-tblgen.rb -vo enc/trans/single_byte.c ../trunk/enc/trans/single_byte.trans; do   date; done

と実行して方っておいても、異常終了してくれない。

なので、手動 bisect みたいなこと(つまり、svn up でリビジョンを巻き戻す)をするも、わけわかんねーところ(ruby スクリプトのコード変更)あたりで止まってしまう。つまり、その ruby スクリプトの変更が、なんらかのひこう(なぜか変換出来ない)をついてしまったようだ。

で、どうしようもなくて、他のツールを使ったりしてたけど全然再現せず、

ここで valgrind で使うべきオプションは次の 3 つであった。

  • --malloc-fill=11 数字はなんでもいいんだけど、malloc 時に数字で埋める
  • --free-fill=22 数字はなんでもいいんだけど、free 時に数字で埋める
  • --error-exitcode=1 エラーが起きたとき、エラーコードを 1 にする

とりあえず、--error-exitcode を知らないで、画面をぼーっとしていたら invalid write が起きていて気づけたという話(多分)。

まぁ、色々ツールの使い方は気をつけてみるといいかもね、という。

治った結果が http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=47252。間違ってるけど(最初 goto で書いてたので...)。


実は手作業 bisect で色々追い詰めておいたのが、バグ再現で重要だったようだ。なんか、最新版(の直す前の一歩手前)で valgrind かけてもさっぱり出てこない。

再現コードがあって、本当によかった。

Log

2002 01 02 03 04 05 06 07 08 09 10 11 12
2003 01 02 03 04 05 06 07 08 09 10 11 12
2004 01 02 03 04 05 06 07 08 09 10 11 12
2005 01 02 03 04 05 06 07 08 09 10 11 12
2006 01 02 03 04 05 06 07 08 09 10 11 12
2007 01 02 03 04 05 06 07 08 09 10 11 12
2008 01 02 03 04 05 06 07 08 09 10 11 12
2009 01 02 03 04 05 06 07 08 09 10 11 12
2010 01 02 03 04 05 06 07 08 09 10 11 12
2011 01 02 03 04 05 06 07 08 09 10 11 12
2012 01 02 03 04 05 06 07 08 09 10 11 12
2013 01 02 03 04 05 06 07 08 09 10 11 12
2014 01 02 03 04 05 06 07 08 09 10 11 12

SASADA Koichi (ko1 at atdot dot net) / Skype ID: ko1_ssd


rss