Сбой потока 0 с состоянием потока X86 (32-разрядный): в приложении какао
Я делаю исправление сбоев в приложении OSX. Отчет о сбоях показывает
Date/Time: 2012-05-01 16:05:58.004 +0200
OS Version: Mac OS X 10.5.8 (9L31a)
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000545f5f00
Crashed Thread: 8
Thread 8 crashed with X86 Thread State (32-bit):
eax: 0x140e0850 ebx: 0x00060fc8 ecx: 0x92df0ec0 edx: 0xc0000003
edi: 0x545f5f00 esi: 0x140e0870 ebp: 0xb0445988 esp: 0xb0445964
ss: 0x0000001f efl: 0x00010206 eip: 0x92dca68c cs: 0x00000017
ds: 0x0000001f es: 0x0000001f fs: 0x0000001f gs: 0x00000037
cr2: 0x545f5f00
Как тарировать код приложения с этим отчетом?
Что такое поток 0 сбой с состоянием потока X86 (32-разрядный)?
если кто-нибудь знает, пожалуйста, помогите мне. Заранее спасибо.
2 ответа
Ознакомьтесь с техническими примечаниями Apple по CrashReporter здесь: https://developer.apple.com/library/mac/
Thread 0 crashed with X86 Thread State (32-bit):
eax: 0x00000000 ebx: 0x942cea07 ecx: 0xbfffed1c edx: 0x94b3a8e6
edi: 0x00000000 esi: 0x00000000 ebp: 0xbfffed58 esp: 0xbfffed1c
ss: 0x0000001f efl: 0x00010206 eip: 0x00000000 cs: 0x00000017
ds: 0x0000001f es: 0x0000001f fs: 0x00000000 gs: 0x00000037
cr2: 0x00000000
Для компьютеров на базе Intel с 32-битным кодом вы должны учитывать следующие моменты:
Сосредоточьтесь на двух значениях: eip и адресе исключения (описанном ранее).
eip - это программный счетчик в момент возникновения исключения. То есть адрес инструкции вызвал исключение. Для большинства исключений доступа без использования памяти (например, EXC_ARITHMETIC/EXC_I386_DIV, вызванных целочисленным делением на ноль), это значение ключа.
Для исключения доступа к памяти:
Если eip равен адресу исключения, исключение было вызвано извлечением инструкций. Обычно это означает:
вы вызвали фальшивый указатель на функцию (или, что эквивалентно, вызвали метод на фальшивом объекте)
вы вернулись на неверный адрес, что, в свою очередь, означает, что вы испортили стек
Если eip не равен адресу исключения, исключение было вызвано инструкцией доступа к памяти (в терминах C это означает, что вы разыменовываете недопустимый указатель).
Вы получаете информацию о сбое, включая причину сбоя (EXC_BAD_ACCESS в потоке 8), содержимое регистров и обратные следы для каждого потока.
Резьба 8 рухнула. В той части отчета о сбое, которую вы здесь не вставляли, есть трассировки стека для каждого потока, включая поток 8. Посмотрите, что он делал, и вы можете лучше понять, что произошло.