リリース版のデバッグ

うるおっしゃあぁ!

なんか一週間も更新せんで、新記録樹立って感じですな。
んまぁ、ハードディスク逝ったり、卒研の中間発表が近かったりで忙しかったんで。

というのが表向きの言い訳ですが、それ以上にプログラムに集中していたのが現状です。
近年まれにみる本気モードでした。
一応、日の高い間は学校に行ってたんですが、それ以外の時間はずっとディスプレイに向かい続けるという有様。
洗濯物もたまってます。
新聞も読んでません。
ゴミ出しも忘れてます、ゴミ袋の中で下衆(蟲)が飛び交ってます。
家賃は今日払いに行きました。
痩せました、というかやつれました(笑)。 ←笑える分まだ元気

ちゅーか、本気モード発動は一週間が限界です。
それ以上やったら強制的に休息イベントが発生してフラグが立っていれば河島はるかが様子見に来るなんてコトになってしまいます。
いや、それだったら願ったり叶ったり。

上記のネタはWHITE ALBUM をプレイして フランク長瀬に魂を捧げると理解可能になります。

仕様も実装も自分次第だから、コロコロ変わって、似たようなコードを何度書き直したことか…。
まぁ、どうにか最終形態が見えてきたのでこうして日記書く余裕があるわけですが。
いや、チラッと見えただけなのでまた隠れてしまうかも知れませんが。

とりあえず一週間更新しないなんてのは(長期休暇を除いて)今回で最後にします。
したいです。
すくなくとも三日にいっぺんぐらいはどうにか。
だから見捨てないで(謎)。

それにしてもデバッグ版で何ともないのに、リリース版で実行時エラー(いわいる不正な処理)が出るのには参りました。
それも標準ライブラリ絡みで。
カヲル君(虫の居所)を見つけるのに半日費やしてしまいましたよ。
久々にStudio MIYABI 用のおいしいネタになってくれそうですが、そっちまで更新するのが面倒なので、こっちに書いてしまいましょう。
ひょっとするとVisual C++ 6.0 依存かも知れません。

まずは strtok() のバグ(?)。
テキスト処理をする際、かなり便利な関数なんですけどね。
こんなコードで実行時エラーが出ました。

pre(C++)..
LPCTSTR token = “ ,\t”;
char *p = ::strtok(str, token); // ←ここで例外違反が起きてた
while (p) {
// なんか処理
p = ::strtok(NULL, token);
}

定石のようなコードなんですが、オレっちのケースでは str = "" (空の文字列)を渡してる場合があったんです。
ヘルプを見ると、第一引数は「トークンの入っている文字列」となってました。
トークンが含まれてない文字列を渡してはいけないってことですかねぇ?
でもそれじゃ strtok() の威力半減って気がするんですけど。

もひとつは STL のコンテナで。
こんな感じのコードでした。

pre(C++)..
// it は list のイテレータ
if (it->hogehoge() false || it list.end()) {
// なんか処理
}

よく考えると評価の順番がおかしいです。
自分でも何でこんな風に書いたのか…。
おそらく最初は別々の if 文だったのを、共通に処理できるようにして it==list.end() の条件式をコピー&ペーストしちゃったんでしょう。
it==list.end() のときに it->hogehoge() なんてやったらエラーになってあたりまえなんですが。
それなのに、デバッグ版だと何故かエラーにならんのです。
デバッグ版のコンテナは少し多めにメモリを確保するっぽいので、運悪く(笑)エラーにならなかったと想像しますが。

繰り返しますが、どちらもデバッグ版だと正常に動作します
一度のアクセス違反すら発生しません。
偶然が重なり続けた可能性もありますけどね。

ともあれ、リリース版をデバッグするのはしんどい作業です。

コメント

タイトルとURLをコピーしました