2009-04-21 4 views
1

私は今日非常に奇妙なバグに遭遇しました。フォーム上にボタンがあり、クリックするとフォーム上のグリッドにデータが設定されます。ボタンを2回クリックすると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というクラッシュが発生します。いつブレークポイントがコードの実行方法を変更できますか?

私は、そのグリッドの母集団を扱うSubの先頭にブレークポイントを配置してしまいましたが、それは見つかりました...それはもうクラッシュしませんでした。私はボタンをクリックし、Visual Studioで 'F5'を押してもクラッシュしませんでした。私はこれを少なくとも10回しましたが、修正されました。

次に、ブレークポイントF5'edを削除し、ボタンをクリックしてクラッシュしました。ブレークポイントを追加することで、ブレークポイントを動作させることができます。

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

EDIT:これはここで起こってデータのいくつかの非同期ロードがあるかもしれませんVB.Netアプリケーション/のVisual Studio 2008

答えて

5

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

4

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

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

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

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

ボタンをクリックするとすぐに無効にしてから、処理が完了した後に再度有効にすることができます。これにより、根本的な問題を解決できない場合(たとえば、第三者の管理下にある場合)、問題が発生しなくなります。

1

私はそれが手動でデバッグを行うのにかかる時間と関係があると思います。おそらく、あなたは、あなたがデバッグしているとき、それが完了するまでの時間を持っていますが、デバッグないとき、それはアプリケーション

1

もう一つの可能​​性...多くの場合

をクラッシュし、ブレークポイントのことを何か重い作業(データベースへのおそらく接続)を持っていますブレークポイントのコードを見ている場合は、プロセスの実行時の動作を変更します。たとえば、プロパティの上にマウスを置くか地元のウィンドウを開いた場合、プロパティはその場で評価された後、さらにコードに進みます。

プロパティのゲッターは現実的には単なるメソッドなので、コードが不十分であるクラスは実際にコードがクラッシュしないようにするプロパティで「余分な」作業を行うことができます。

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

関連する問題