FC2ブログ
にほんブログ村 IT技術ブログへ
にほんブログ村
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
以前、僕は組み込みの開発に携わっていました。組み込み系のプログラマーにとって、スタックオーバーフローはつねに悩みの種です。

組み込みの機器では使えるメモリの量は常に制限されます。そのため、組み込み用のプログラムを実装するときはメモリの動的確保はしない(確保するとしても少量)、必要なメモリは起動時に確保する、再帰は使わない、といったことがセオリーとなっているようです。

僕が以前開発していた機器はVxWorks上で動作するため、以下ではVxWorks上にて経験した内容を書きます。

スタックオーバーフローの非情に厄介なところは、スタックオーバーフローが発生したこと自体に気付きにくいということです。VxWorksでは、スタックオーバーフローが発生した場合、コンソールにエラーメッセージは出力されません(※1)。ある時はタスク(スレッドのことです)の動きが固まってそれ以降コンソールからの入力を一切受け付けなくなったり、またある時はOS自体が再起動してしまったりと、色々な動きをしました。スタックオーバーフローが起きるとどんな挙動になるのか予想がつかないので、何が起こっているのかを把握するのがとても難しいのです。

スタックオーバーフローを未然に防ぐためには、そのタスクが最大でどれくらいのスタックを消費するのかを、常に正確に把握する必要があります。幸いにもVxWorksにはcheckStackというコマンドがあるので、それを使ってスタックの使用量を確認できます。それだけではなく、スタックの使用量はタスクがどのような動作をした時に最大となるか、つまり、どの機能を有効にした場合に最大になるかを正確に把握する必要があります。開発対象の機種は複数あり、その各機種ごとにサポートされる機能が違います。そのため、どの機能が有効になったときにスタックの使用量が最大になるのかを知っておく必要があります。

僕が確認した機種では複数の機能をサポートしており、スタック使用量を確認したところ、サポートしている全ての機能を同時に有効にしたときが最大となりました。これは、考えてみれば当然ですね。有効になる機能が増えればその分だけスタック使用量も増えるので、当然の結果と言えます。

何らかの機能を追加して、その結果スタック使用量が心配になった場合は、常にスタック使用量を確認します。スタックの残りの量がそろそろ危なくなってきた(少なくなってきた)と思ったら、早めにそのタスクに割り当てられたスタックサイズを増やしておきます。

ちなみに、スタックオーバーフローに対処するための仕組みをプログラムの中に入れておく方法もあるようですが(※2)、高度なテクニックなのでここでは紹介しません。


※1 少なくとも僕が開発していたVxWorksの環境ではエラーメッセージは出力されませんでした。設定次第では出力されるかも知れません。知っている方がいたら教えてください。

※2 BINARY HACKS には、こういったスタックオーバーフローに関連したテクニックが紹介されています。

スポンサーサイト
Secret

TrackBackURL
→http://tsurujiro.blog.fc2.com/tb.php/14-fd1b6e5c
/* 引用 */ blockquote { padding: 0.3em 0.3em 0.3em 0.5em; width: 80%; border-left: 5px solid #4a0400; background-color: #AFEEEE; font-size: 0.875em; overflow: auto; } blockquote pre, blockquote pre code { margin: 0; overflow: auto; }
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。