4

我正在 OS X 应用程序中进行崩溃修复。崩溃报告显示

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 位)而崩溃?

4

2 回答 2

4

在此处查看 Apple 关于 CrashReporter 的技术说明:https ://developer.apple.com/library/mac/#technotes/tn2004/tn2123.html

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

对于运行 32 位代码的基于 Intel 的计算机,您应该考虑以下几点:

关注两个值:eip 和异常地址(如前所述)。

eip 是发生异常时的程序计数器。也就是说,它是导致异常的指令的地址。对于大多数非内存访问异常(例如,整数除以零引起的 EXC_ARITHMETIC/EXC_I386_DIV),这是关键值。

对于内存访问异常:

如果 eip 等于异常地址,则异常是由取指令引起的。通常这意味着:

你调用了一个伪造的函数指针(或者,等效地,调用了一个伪造对象的方法)

你返回了一个错误的地址,这反过来意味着你已经破坏了堆栈

如果 eip 不等于异常地址,则异常是由内存访问指令引起的(就 C 而言,这意味着您正在取消引用无效指针)。

于 2012-06-19T09:13:17.987 回答
0

您将获得有关崩溃的信息,包括崩溃的原因(线程 8 中的 EXC_BAD_ACCESS)、寄存器内容和每个线程的回溯。

线程 8 崩溃了。在您未在此处粘贴的崩溃报告部分中,每个线程都有堆栈跟踪,包括线程 8。看看它在做什么,您可能会更好地了解发生了什么。

于 2012-06-19T09:06:52.343 回答