0


0

ロード中にアプリケーションが時々「ハング」する理由を解決するためのヒント

ロード中に*時々* 'スタック’する(かなり大きい)アプリケーションがあります-コントロールが半分塗られているなどです。

私がログから解決できたことから、これは_Loadイベントの終了後に発生します。

Visual Studioから実行しているときに起こったのは一度だけで、一時停止を試みましたが、メインのApplication.Run行に移動しただけなので、あまり役に立ちませんでした。

TaskManは、アプリケーションが「応答していない」とは言いませんが、それが機能するのに十分な時間待てないのかもしれません(誰がどれくらい時間がかかるか知っていますか?)

私は物事を絞り込もうと試みます(テストマシンのProcessExplorerなど)が、誰かが検索する方向のアイデアを持っている場合は、printfをすべてのコードに入れ始める前に…​

5 Answer


1


dotTRACEやhttp://www.red-gate.com/products/ants_performance_profiler/index.htm[ANTS]などのプロファイラーを使用します。 また、一時停止するときに、別のスレッドでコードを実行している場合は、次を選択して他のスレッドに切り替えることができます。

デバッグ→ Windows→スレッド。


1


指定した診断は動作と一致します。 フォームのLoadイベントは、フォームがペイントされる前に実行されるコードの最後のビットになります。 表示されるイベントは次の予定です。 デバッガーは実際にApplication.Run()呼び出しで停止します。これは、デバッガーがソースコード情報を持っているために書いた最後のコードです。

重要なのは、Call Stackウィンドウを慎重に調べることです。Application.Runの上に追加のスタックフレームがあるはずです。 ハングを引き起こすコードがマネージコードである場合、一番上の問題はトラブルメーカーです。 ソースコードはありません。そのコードが必要な場合は、Microsoft Reference Sourceサーバーでセットアップすることが重要です。

しかし、マネージコードである可能性はほとんどありません。ペイントイベントハンドラーの大部分は、Windowsまたは何らかのActiveXコントロールのアンマネージコードです。 この種のコードを理解するには、アンマネージデバッグを有効にする必要があります。 プロジェクト+プロパティ、[デバッグ]タブ。 また、[ツール] + [オプション]、[デバッガー]で[Just my code]をオフにします。 スタックトレースを理解するには、Microsoftのシンボルサーバーからシンボルをデバッグするためのセットアップを取得することが重要です。スタックトレースで16進アドレスのみを取得する場合はそうしてください。

次に、ペイントされているものとされていないものを観察することにより、この問題を引き起こしている特定のコントロールを確認できるはずです。 コントロールはZオーダーでペイントされます。表示されない、または部分的にしか表示されないコントロールは、トラブルの原因となるはずです。 Windowsでペイントがハングする、または .NET controls are unheard of, suspect any kind of ActiveX control on あなたのフォーム。


0


プロファイラーをアタッチして、起動時にどこで時間が費やされているかを確認できます。 それはあなたを良い候補者に導くかもしれません。


0


それの音によって、どこかに無限ループができます。 Loadイベントの後に発生する長く巻き込まれたプロセスやループを調べます。


0


デバッガー内で問題が発生しない場合、プログラムを実行し、ハングするのを待ってから、Visual Studio内から_Attach to Process …​_(VS2005の[ツール]メニューの下)に移動できます。

次に、他のポスターが述べたようにスレッドを調べます。