1

今日は非常に奇妙なバグに遭遇しました。フォームにボタンがあり、それをクリックすると、フォームのグリッドにデータが取り込まれます。ボタンを 2 回クリックすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージが表示されてクラッシュします。

そのグリッドの人口を処理する Sub の先頭にブレークポイントを配置することになりましたが、クラッシュしなくなったことがわかりました。ボタンをクリックして、Visual Studio で 'F5' を押しても、クラッシュしませんでした。私はこれを少なくとも10回行いましたが、修正されました。

次に、ブレークポイントを削除し、F5 キーを押してボタンをクリックすると、クラッシュします。ブレークポイントを再度追加すると、機能するようになります。

誰かがここで何が起こっているのか説明できますか? 私が使用しているグリッドはサードパーティ コントロール (Infragistics) であり、アプリケーションは WinForms アプリです。私はスレッド化を行っていません-私の唯一の考えは、それがある種の「競合状態」であるということですか? しかし、それでさえ私には本当に意味がありません。

編集:これはVB.Netアプリケーション/ Visual Studio 2008です

4

4 に答える 4

5

ここで、データの非同期ロードが行われている可能性があります。ブレークポイントを追加すると、非同期部分が終了する時間が与えられます。クリックが速すぎると、データの読み込みが完了するか何かを待っているため、エラーが発生します。あなたはこれを実装していないかもしれませんが、サードパーティのコントロールが実装している可能性があります。

于 2009-04-21T16:22:39.520 に答える
4

タイミングの問題のように聞こえますが、バックグラウンドでスレッド化が行われている必要があります (おそらくサードパーティのコントロールで)。

例外からコール スタックを取得できますか?

リリース モード (またはブレーク ポイントがない場合) では、最初のクリックが完全に処理される前に、もう一度ボタンをクリックできます。

ブレーク ポイントを設定すると、デバッガーがフォーカスを取得し、アプリが再び同期できるようになります。

クリックするとすぐにボタンを無効にし、処理が完了した後に再度有効にすることができます。根本的な問題を修正できない場合 (たとえば、サード パーティのコントロール内にある場合)、問題の発生を止めることができます。

于 2009-04-21T16:24:49.017 に答える
1

もう1つの可能性...

多くの場合、ブレークポイントでコードを見ている場合、ブレークポイントはプロセスの実行時の動作を変更できます。たとえば、プロパティにカーソルを合わせるか、ローカル ウィンドウを開いている場合、プロパティはその場で評価されてから、次のコードに進みます。

プロパティの getter は現実的には単なるメソッドであるため、適切に記述されていないクラスは、コードのクラッシュを防ぐプロパティで「余分な」作業を実際に行うことができます。

これは特に可能性が高いわけではありませんが、プロパティの遅延初期化を行ったサードパーティのライブラリでこれを見ましたが、メソッドの 1 つの前に正しく初期化しませんでした。コードでプロパティを見たことがない場合、例外がスローされますが、プロパティにアクセスするだけでクリーンアップされます。

于 2009-04-21T16:34:49.130 に答える
1

手動でデバッグを行うのにかかる時間と関係があると思います。おそらく、重い作業 (おそらくデータベースへの接続) があり、デバッグ中は終了する時間がありますが、デバッグしていないときはアプリケーションがクラッシュします。

于 2009-04-21T16:24:55.503 に答える