Сбой потока 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. Посмотрите, что он делал, и вы можете лучше понять, что произошло.

Другие вопросы по тегам