1

windbg を使用してクラッシュ ダンプ ファイルを分析し、拡張コマンドを入力して基本的な分析結果を取得する "!analyze -v" と、次のように結果を取得します:- (情報の一部のみをここに貼り付けました)

....
  ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 00000004
Attempt to read from address 00000004

PROCESS_NAME:  tscommand.exe

...

LAST_CONTROL_TRANSFER:  from 010444c2 to 010181e6

FAULTING_THREAD:  00002270

BUGCHECK_STR:  APPLICATION_FAULT_NULL_CLASS_PTR_READ_AFTER_CALL

PRIMARY_PROBLEM_CLASS:  NULL_CLASS_PTR_READ_AFTER_CALL

DEFAULT_BUCKET_ID:  NULL_CLASS_PTR_READ_AFTER_CALL

STACK_TEXT:  

...

ここで「BUGCHECK_STR: APPLICATION_FAULT_NULL_CLASS_PTR_READ_AFTER_CALL」とはどういう意味ですか? 関数を呼び出した後に NULL クラス ポインタが原因で、アプリケーションに問題があるということですか? ネットを検索しましたが、APPLICATION_FAULT_NULL_CLASS_PTR_READ_AFTER_CALL について何も見つかりません。

4

1 に答える 1

2

「BUGCHECK_STR」は、Microsoft がエラーを「分類」するために使用する分類です。これは、NULL クラス ポインターがあることを示しているように見えます。 NULL ポインターのベースから離れた小さなオフセット。

基本的に、何かへのポインターを使用している状況があり (それ自体がクラスであると 100% 確信しているわけではありません)、逆参照する時点でポインターが NULL です。これがメンバー関数の呼び出しによって引き起こされる可能性は十分にあり、デバッガーは [呼び出しスタック、シンボル、およびレジスタ値の組み合わせを調べることで] それを把握できますが、WinDBG がこれらのものを取得することは不明ではありません。時々間違っています-それはヒューリスティックなので、「ここにこの値があり、そこにその値があり、他の何かがこの範囲に一致する場合、それはこのエラーのグループです」のようなものです。

クラッシュの時点でのスタック/レジスタ値をもう少し投稿すると、何が問題だったのかをもう少し理解できるかもしれません。

エラー コードとエラーを伴う余分なデータの組み合わせから確かなことは、コードがメモリ内のアドレス 4 を読み取っていることです。これは通常、「NULL」が指すクラス/構造体で 2 番目の整数または浮動小数を使用しようとすることを意味します。コードで「if (ptr != NULL) ...」を忘れたときに、これをかなりの回数見ました。時々私たちのほとんどに起こります...

于 2013-02-20T12:39:23.067 に答える