マルチスレッド(./MT)だとエラーになり、マルチスレッド デバッグ(./MTd)にすると動作するexeのデバッグをするには?

解決


どら  2009-03-26 18:32:22  No: 69882  IP: [192.*.*.*]

久しぶりの投稿になります。

VS Team System 2008 Development Edition で、SDKでダイアログアプリケ
ーションを作成しました(OSはXPです)。

作成したアプリケーションで不思議なことが起こっており困っています。
1.VS上のデバッグ実行からアプリを動かすと通常通り動作
2.プロジェクトのプロパティで、「コード生成」の「ランタイム ライブ
  ラリ」を「マルチスレッド/MT」として作成したexeをダブルクリックし
  て実行するとある処理で「問題が発生したため・・・」とエラー終了
3.同様に「マルチスレッド/MTd」としてビルドしたexeをダブルクリック
  して実行すると、問題なく動作

以上のような状態になっています。
おそらくどこかにバグがあるからだと思っているのですが、デバッグモー
ドで実行すると問題なく動作してしまうので、問題箇所が発見できずに困
っています。

どうにかデバッグする方法などありましたらご指導いただけないでしょう
か?

VS2003→2008になって(デフォルトがマルチスレッド DLLになっていたり、
文字コードがUnicodeになっていたり・・・結構苦戦しています)。

よろしくお願いいたします。

編集 削除
wclrp ( 'o')  2009-03-26 21:12:33  No: 69883  IP: [192.*.*.*]

変数の値とかは間違えてるし
ステップ実行は間違った行を指すけど
リリースでもデバッグ情報を付ければ多少の位置はわかるんじゃないの。
一時的にファイル単位で最適化なしにしてコンパイルして絞り込むとか。
# 後で戻し忘れないように。

ログをファイルに出す仕組みをつけて徹底的にチェック。
値を設定してない変数を参照するなどのミスを地道に探す。
コンパイラの警告をチェック。
リリースでも使えるASSERTみたいなの入れまくり。

マルチスレッドDLLは大は小を兼ねるで問題ないはず。
Unicodeは指定すれば解除できるでしょ。

編集 削除
仲澤@失業者  2009-03-27 11:58:24  No: 69884  IP: [192.*.*.*]

不明確な点があるので、質問させてください。
  1.デバッグビルド + /MT
  2.デバッグビルド + /MTd
  3.リリースビルド + /MT
  4.リリースビルド + /MTd
の、どれがど〜なるのでしょう。

編集 削除
どら  2009-03-27 16:12:24  No: 69885  IP: [192.*.*.*]

wclrp ( 'o')さん、仲澤@失業者さん、ご教授ありがとうございます。

> ログをファイルに出す仕組みをつけて徹底的にチェック。
> 値を設定してない変数を参照するなどのミスを地道に探す。

この辺を試してみようと思います。

> コンパイラの警告をチェック。

実は・・・警告0なんです>_<

> マルチスレッドDLLは大は小を兼ねるで問題ないはず。
これ、DLLにすると、ランタイムかなんかインストールしないと動作しない場
合がありませんか?
私は過去にWin PE 2.0用のプログラムを作成したこともあって、その時に躓い
て、可能な限りマルチスレッドDLLではビルドしないようにしています。
Client PCに余計なランタイムなどをいれずに動作するのであれば、それがベ
ストだと私は考えているので・・・(そもそもそれが間違っているのかも知れ
ませんが)

> Unicodeは指定すれば解除できるでしょ。
それは仰るとおりですが、マルチバイトの古いソースを普通に読み込んで、何
も知らずに初めて2008でコンパイルした時は焦りましたよ(笑)

しかもDefaultはUnicodeになってるくせに、WriteFileでテキストに書き込む
ときは、マルチバイトに変換しないと文字化けするし・・・
「マイクロソフト どうにかしてくれ〜」って感じです(笑)
今ではだいぶ慣れました。


>  1.デバッグビルド + /MT
>  2.デバッグビルド + /MTd
>  3.リリースビルド + /MT
>  4.リリースビルド + /MTd
の、どれがど〜なるのでしょう。

リリース、デバッグにかかわらず

    /MT   :NG
    /MTd  :OK

と言う状況です。

編集 削除
仲澤@失業者  2009-03-30 10:36:35  No: 69886  IP: [192.*.*.*]

>リリース、デバッグにかかわらず
>    /MT   :NG
>    /MTd  :OK

はぁ。では、「1.デバッグビルド + /MT」でトレースしていけば
どの行で落ちるかわかるのではないですか。

編集 削除
どら  2009-03-30 14:13:42  No: 69887  IP: [192.*.*.*]

仲澤@失業者 さん
レスありがとうございます。

>はぁ。では、「1.デバッグビルド + /MT」でトレースしていけば
>どの行で落ちるかわかるのではないですか。

上記の状態でビルドした後に

    デバッグの実行→問題なく動作
    作成したexeを直接実行→NG

なんです。
で、エラーが発生したときにデバッグを行いますか?でデバッガを起動しても
停止するポイントはDialogBox関数のところなんです。
(実際にはDialogBoxは問題なく動いていて、中である特定のボタンをクリック
したときにエラーが発生していたので、その中で行っている処理のどこかであ
る事はわかっていたんです)。

今回はwclrp ( 'o')さんの案で、合間にログをはくようなものを挿入して調べ
て行きました。
原因が特定でき解決しました。

本当にありがとうございました。

編集 削除