Я пытаюсь проанализировать файл аварийного дампа с помощью windbg и набрать команду расширения, чтобы получить некоторый базовый результат анализа «! Analysis -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.
«BUGCHECK_STR» — это классификация, используемая Microsoft для «классификации» ошибок, и эта, по-видимому, указывает на то, что у вас есть указатель класса NULL, что мне кажется правильным, поскольку чтение памяти происходит с адреса 4, который является небольшое смещение от основания нулевого указателя.
По сути, у вас возникает ситуация, когда вы используете указатель на что-то (я не уверен на 100%, что это класс как таковой), и указатель равен NULL в тот момент, когда вы разыменовываете его. Вполне возможно, что это вызвано вызовом функции-члена, и отладчик может выяснить это [глядя на комбинацию стека вызовов, символов и значений регистров], но WinDBG не знает, как получить эти вещи. время от времени это неправильно — это эвристика, так что это что-то вроде: «Если у нас есть это значение здесь, и это значение там, и что-то еще соответствует этому диапазону, то именно эта группа ошибок».
Если вы разместите немного больше значений стека / регистра в момент сбоя, возможно, будет возможно узнать немного больше о том, что пошло не так.
Из комбинации кода ошибки и дополнительных данных с ошибкой очевидно, что ваш код читает адрес 4 в памяти. Что обычно означает попытку использовать второе целое число или число с плавающей точкой в классе / структуре, на которые указывает «NULL». Я видел это довольно много раз, когда я забыл «if (ptr! = NULL) …» в моем коде. Случается с большинством из нас время от времени …
Других решений пока нет …