トップ回答者
デバッグで例外発生 System.ArgumentException するが、コードのどこで例外が発生したのか、わかりません。

質問
-
Vc++2012Express
C++/CLIで作成中ですが、
型'System.ArgumentException'のハンドルされていない例外が
System.Drawing.dllで発生しました
追加情報:使用されたパラメーターが有効でありません
というウィンドウが出ます。
コードの停止する場所は、
int main(){
MyForm^ mf = gcnew MyForm();
Application::Run(mf);
Application::Exit(); ←ここで停止している矢印マークがでます。
return 0;
}
もう少し詳しい例外が発生した原因を調べたいのですが
それ以外の情報がなく、困ってます。
何か、詳細な情報を知る方法はないでしょうか?
ちなみに、ソフトは
カメラ画像をキャプチャして、PictureBoxのimageにデータを入れて
表示させてます。ウィンドウの切替や、PictureBOXの表示エリアなどを画面外に
持っていくなどしたり、頻繁に行うと発生します。
リソースの開放忘れが原因とか、よくググると出てますが、
どこの個所なのか、分からずに困っています。
どなたか、詳しい情報の味方などありましたら、お教え願いたいと思います。
よろしくお願いします。
回答
-
「呼び出し履歴」ペインに自分のコード以外の部分は見えていますか?
見えていない場合はデバッグメニューのオプションと設定から開くダイアログで、マイコードのみ表示というチェックを外すと何か見えますか?そちらでも例外が発生している箇所がつかめないなら、「ローカル」ペインに $exception として Exception オブジェクトが見えていれば、StackTrace プロパティを見ることでしょうか。
ただし、これらは発生箇所をなんとかく把握するだけで、直接原因がわかるわけではありません。
例外発生箇所から経験と勘で推測して次の手を考えるなど、原因の特定は容易ではありません。
(System.Drawing 空間がどのように動いているか? Windows のメッセージループはどういったものかとかそういった根っこの動きを知っていると知っていないとで太刀打ちできるかが変わってくる領域かなぁ…) -
まず、デバッガーが例外を正しく処理できなかった点について、C++/CLIという言語はネイティブなC++言語とマネージな.NETの双方を扱えるものです。CLRプロジェクトを作成するとデバッグの種類として[自動]が選択されていますが、デバッガーとしてはこのような事情を把握できていないかもしれません。双方を扱える[混合]を選択する必要があります。
次に例外が発生した原因について、現時点ではほとんど情報がないため確実なことは言えませんが、挙げられたソースコードから読み取れる問題を指摘します。System.Drawingを使用するためにはメインSTAスレッドから呼び出す必要があります。ネイティブなどでCOM初期化を行わない場合は自動的にメインSTAスレッドとなるため問題ありませんが、マネージな.NETでは設定を行わない場合、MTAスレッドとして初期化されてしまうため、明示的な設定が必要です。
[STAThread] int main(){ ... }
と指定すれば改善されるかもしれません。
C++/CLIはC++言語に関する深い知識と.NETに関する深い知識、更に両者の相違点に関する理解が求められます。気軽に扱える言語ではないことを認識していただいたほうがいいかと。
すべての返信
-
「呼び出し履歴」ペインに自分のコード以外の部分は見えていますか?
見えていない場合はデバッグメニューのオプションと設定から開くダイアログで、マイコードのみ表示というチェックを外すと何か見えますか?そちらでも例外が発生している箇所がつかめないなら、「ローカル」ペインに $exception として Exception オブジェクトが見えていれば、StackTrace プロパティを見ることでしょうか。
ただし、これらは発生箇所をなんとかく把握するだけで、直接原因がわかるわけではありません。
例外発生箇所から経験と勘で推測して次の手を考えるなど、原因の特定は容易ではありません。
(System.Drawing 空間がどのように動いているか? Windows のメッセージループはどういったものかとかそういった根っこの動きを知っていると知っていないとで太刀打ちできるかが変わってくる領域かなぁ…) -
まず、デバッガーが例外を正しく処理できなかった点について、C++/CLIという言語はネイティブなC++言語とマネージな.NETの双方を扱えるものです。CLRプロジェクトを作成するとデバッグの種類として[自動]が選択されていますが、デバッガーとしてはこのような事情を把握できていないかもしれません。双方を扱える[混合]を選択する必要があります。
次に例外が発生した原因について、現時点ではほとんど情報がないため確実なことは言えませんが、挙げられたソースコードから読み取れる問題を指摘します。System.Drawingを使用するためにはメインSTAスレッドから呼び出す必要があります。ネイティブなどでCOM初期化を行わない場合は自動的にメインSTAスレッドとなるため問題ありませんが、マネージな.NETでは設定を行わない場合、MTAスレッドとして初期化されてしまうため、明示的な設定が必要です。
[STAThread] int main(){ ... }
と指定すれば改善されるかもしれません。
C++/CLIはC++言語に関する深い知識と.NETに関する深い知識、更に両者の相違点に関する理解が求められます。気軽に扱える言語ではないことを認識していただいたほうがいいかと。