2014年4月21日月曜日

通常実行時に稀に観測されるSEGVがgdbを通すと観測できない場合にはset disable-randomization offするとよいかもしれないはなし

やや複雑化したソフトウェアの開発中に、およそ10回実行すれば1回くらいの頻度でソフトウェアの終了時にSEGVが発生してしまう現象を観測しました。

毎回発生するわけではないので、とりあえず簡易的に数を撃って発生頻度を感覚的に把握:
for n in `seq 1 10`; do testing-app 2>&1 | grep seg&; done
こんな事をすると testing-app を10個非同期に実行して seg 文字列が観測された場合にログ表示されます。今回はこれを何度か試してみたところ、凡そ10回の実行で1回くらいSEGVが終了時に発生する事は確認できました。

そこで次に、gdbを通してtesting-appを実行し、SEGVの発生を待つのですが、r r r r r r r … さてさて、何度実行しても SEGV が派生しません(´・ω・`)

少々考えたのち、 stackoverflow で適当に検索してみると、「gdbはデフォルトでメモリーランダマイズを無効にするんだけど、メモリーレイアウトに起因して発生するSEGVを観測したいときには set disable-randomization offしてみるといいよ」的な話を見つけました(╹◡╹)
gdb testing-app
のち、gdbのインタラクティブシェルで、
set disable-randomization off
そして何度か r r r r ... すると今度は SEGV とその原因に出会えました(╹◡╹)



参考:

  1. stackoverflow - segfault only when NOT using debugger

0 件のコメント:

コメントを投稿