2013-02-20 3 views
1

Я пытаюсь проанализировать файл дампа сбоев с помощью windbg и набирать команду расширения для получения некоторого базового результата анализа «! Analysis -v» и получить результат следующим образом: - (я только вставил часть информации здесь)Что значит «BUGCHECK_STR: APPLICATION_FAULT_NULL_CLASS_PTR_READ_AFTER_CALL» означает в windbg! Analysis -v output

.... 
    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.

+0

Это сообщение об ошибке, которое я никогда не видел. –

+0

Ну, это, вероятно, означает, что вы вызвали функцию класса с нулевым указателем. 0xc0000005 - нарушение прав доступа, а адрес - 0x00000004. –

ответ

2

«BUGCHECK_STR» - это классификация, используемая Microsoft для «классификации» ошибок, и это, по-видимому, указывает на то, что у вас есть указатель класса NULL - что кажется мне правильным, поскольку чтение памяти происходит с адреса 4 , что является небольшим смещением от основания указателя NULL.

В принципе, у вас есть ситуация, когда вы используете указатель на что-то (я не уверен, что это класс как минимум на 100%), и указатель имеет значение NULL в момент, когда вы разыгрываете его. Вполне возможно, что это вызвано вызовом функции-члена, и отладчик может понять это [просмотрев комбинацию стека вызовов, символов и значений регистра], но WinDBG не знает, как получить эти вещи неправильно время от времени - это эвристика, поэтому это что-то вроде «Если у нас есть это значение здесь, и это значение там и еще что-то соответствует этому диапазону, то это эта группа ошибок».

Если вы отправили немного больше значений стека/регистра в момент сбоя, возможно, было бы возможно узнать немного больше о том, что пошло не так.

То, что определенно из комбинации кода ошибки и дополнительных данных с ошибкой, является то, что ваш код считывает адрес 4 в памяти. Обычно это означает попытку использовать второе целое число или float в классе/структуре, на которое указывает «NULL». Я видел это несколько раз, когда забыл «if (ptr! = NULL) ...» в моем коде. Бывает с большинством из нас время от времени ...

+0

Глядя на разобранный код «здесь, где он идет не так», это явно структура или класс, который передается в том, что идет не так. +4 - это смещение доступной переменной-члена, и вы можете видеть в дампе регистра, что 'eax' равно нулю. Не понимая код, я не знаю, что предложить в качестве следующего шага. Это может быть некоторая структура внутри 'ein', которая виновата. '& rc' - это просто указатель на локальную переменную, верно? –

+0

Нет, адрес локальной переменной в обычной системе (Windows, Linux, MacOS, Symbian и т. Д.) Никогда не будет 4. –

Смежные вопросы