0x00000001(win7 0x00000001 蓝屏)

  • 时间:
  • 浏览:62
  • 来源:奥一装修网

0x00000001错误代码

原始参考:http://www。sealiesoftware。com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend。html然后,您在objc_msgSend()方法中崩溃。发生了什么?通常,您将消息发送到已释放的对象。也许您的指针是完全正确的,但是其他人破坏了该对象的内容-可能是缓冲区超出了附近的应用程序空间,或者使用了悬空的指针。现在,该指针指向的内存已被您的对象占用。有时objc_msgSend()会由于内存错误破坏运行时自己的数据结构而导致崩溃,但这通常是由接收者自己的对象引起的。无论是调试还是查找崩溃日志,您都可以找到比不仅仅是向后追溯的更多崩溃信息。 Receiver和方法选择器寄存器objc_msgSend()在工作时将接收器对象和方法选择器存储在CPU寄存器中。这些值将有助于确定问题。寄存器的名称取决于体系结构和objc_msgSend()调用的各种方式。以下列表已在Mac OS X Jaguar系统上进行了测试,并且可能会继续在Snow Leopard系统上进行测试。 objc_msgSend objc_msgSend_fpretobjc_msgSend_stretreceiverSELreceiverSELi386eax * ecxeax * ecxx86_64rdirsirsirdxppcr3r4r4r5rcppr64r3r4r4r5armr0r1r1r2r如果在挂起之前离objc_msgSend()很远,那么eax寄存器此时可能具有其他值。 说明收件人和非法地址您可以使用崩溃收件人地址和非法地址来获取有关潜在问题的一些提示。在崩溃日志中,非法地址列在列表的顶部(通常使用诸如KERN_PROTECTION_FAILURE之类的名称)。在调试器控制台中,当程序停止时,将打印此非法地址,并且您可以使用上面列表中的寄存器名称来打印收件人的地址。程序收到信号EXC_BAD_ACCESS,无法访问内存。原因:objc_msgSend()(gdb)p / x $ eax $ 1 = 0x1中地址0x000000010x00090ec4的KERN_PROTECTION_FAILURE我的测试程序在【【id】 1版本】崩溃。在真正的崩溃中,这些值将更加典型和有趣。通常,会发生两件事。收件人自己的地址是伪造的,非法地址具有相同的值(16或32个字节)。或者接收者的地址是合理的,那么非法地址就是接收者的isa指针。如果您尝试使用已释放的对象或其他人破坏了您的合理对象,则通常发生后一种情况。 在崩溃中查看这些特殊值。您还可以查看附近的一些值。在某些体系结构中,非法的isa指针将导致isa + 16或isa + 32崩溃。无16字节的分隔错误对齐malloc()函数返回一个16字节的对齐内存块。如果您的接收器不是16字节对齐的,则它可能永远不是有效的对象指针。高两位和低两位都被设置为“分配释放列表”。释放存储块后,内存分配器将在该存储块中写入释放列表指针。如果在此之后使用已经释放的对象,您将看到isa指针的上下两位都已设置。所有位都是相反的-垃圾收集列表类似于上面分配的释放列表的示例,但是由于垃圾收集而导致崩溃。在这种情况下,地址看起来很糟,但是〜地址更合理。 0xa1b1c1d3-CF容器容器可能已重新分配了已释放的对象,或者某些人使用了已释放的容器,此容器已被重新分配给您的对象,或者您从容器中读取了指针,并且其他线程也正在修改此指针。 ,并且您尚未将其锁定到位。 ASCII文本可能是已重新分配给字符串的已释放对象,或者某些人使用了已释放的字符串并且已将其重新分配给您的对象,或者某些字符串操作超出范围。使用asciify命令快速打印这些字节序列。看起来与网址相关,例如:%asciify 0x2e 。 www www Ask方法选择器编译器优化意味着调用者指向的回溯中的第二帧不是真正的崩溃调用。可能是调用成功,然后此方法触发了导致崩溃的尾部调用。由于尾部呼叫优化,该独立帧将在回溯中丢失。我们可以使用选择器寄存器来确定谁是真正的崩溃调用。方法选择器是指向单独的c字符串的指针。在将来的操作系统版本中,这可能会更改,但是现在可以调试了。如果您在调试器中崩溃,请打开调试控制台并运行以下命令,并将其替换为上面列表中的正确SEL寄存器:(gdb)x / s $ ecx0xa1029:Snow Leopard系统的“发布”崩溃报告服务在崩溃日志中已添加选择器名称:特定于应用程序的信息:objc_msgSend()选择器名称:release此外,从崩溃日志中删除选择器名称很困难,而且总是无效的。如果您拥有Snow Leopard系统,请尝试以下选项,祝您好运。 1。从崩溃日志的线程状态中,使用上面列表中的寄存器名称查找SEL的值。 ecx:0x000a10292。从崩溃日志的二进制映像中,找到地址范围在SEL值内的映像。该映像通常是程序本身或libobjc。A。dylib。如果没有跨这些地址的镜像,请放弃。3。在崩溃日志中找到匹配图像的副本。使用UUID确认匹配。 %dwarfdump -u /usr/lib/libobjc。A。dylibUUID:-C6EA-B1C8-52D6-072AC874D400(ppc)/usr/lib/libobjc。A。dylibUUID:9B5973B7-FA88-F9AA-B788-5530C7B278DD(i386)/ usr / lib / libobjc。A。dylibUUID:D2A4E8E1-3C1C-E0D9-2249-125B6DD621F8(x86_64)/usr/lib/libobjc。A。dylib此崩溃与我已安装的i386 libobjc。A。dylib库匹配。如果这是系统库,则可能需要崩溃日志中列出的操作系统版本的映像。如果是应用程序,则需要保存每个版本的副本,对吗? 4。计算图像0xa1029-0x8b000 = 0x5中SEL的偏移量。在图像中的此偏移处打印c字符串。记住要指定正确的架构%otool -v -arch i386 -s __TEXT __cstring /usr/lib/libobjc。A。dylib | grep 000版本(本文仅供参考,如果有任何翻译问题,请多多指教,多亏了原作者)