遇到崩溃报告 - EXC_BAD_ACCESS时遇到问题

时间:2012-10-14 03:05:17

标签: objective-c macos cocoa crash-reports

好的,所以我收到了一个我的应用程序的崩溃报告,但我发誓我百分百困惑。

这就是它的“核心”部分:

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000

VM Regions Near 0:
--> 
    __TEXT                 0000000100000000-0000000100015000 [   84K] r-x/rwx SM=COW  /Applications/MY_APP/Contents/MacOS/MY_APP

Application Specific Information:
objc[337]: garbage collection is ON

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_c.dylib               0x00007fff90128650 strlen + 16
1   MY_BUNDLE_ID                    0x0000000100008f12 0x100000000 + 36626
2   MY_BUNDLE_ID                    0x000000010000b435 0x100000000 + 46133
3   MY_BUNDLE_ID                    0x0000000100003c90 0x100000000 + 15504
4   com.apple.CoreFoundation        0x00007fff9065147a _CFXNotificationPost + 2554
5   com.apple.Foundation            0x00007fff8e5fe846 -[NSNotificationCenter postNotificationName:object:userInfo:] + 64
6   com.apple.AppKit                0x00007fff9a7894a7 -[NSTableView textDidChange:] + 377
7   com.apple.CoreFoundation        0x00007fff9065147a _CFXNotificationPost + 2554
8   com.apple.Foundation            0x00007fff8e5fe846 -[NSNotificationCenter postNotificationName:object:userInfo:] + 64
9   com.apple.AppKit                0x00007fff9a15c260 -[NSTextView(NSSharing) didChangeText] + 339
10  com.apple.AppKit                0x00007fff9a7f8381 _NSDoUserReplaceForCharRange + 390
11  com.apple.AppKit                0x00007fff9a7f85b1 _NSDoUserDeleteForCharRange + 38
12  com.apple.AppKit                0x00007fff9a7e1e72 -[NSTextView(NSKeyBindingCommands) deleteBackward:] + 440
13  com.apple.AppKit                0x00007fff9a18a1cc -[NSResponder doCommandBySelector:] + 75
14  com.apple.AppKit                0x00007fff9a18a02e -[NSTextView doCommandBySelector:] + 197
15  com.apple.AppKit                0x00007fff9a20cf4e -[NSKeyBindingManager(NSKeyBindingManager_MultiClients) interpretEventAsCommand:forClient:] + 2200
16  com.apple.AppKit                0x00007fff9a20c3bb -[NSTextInputContext handleEvent:] + 939
17  com.apple.AppKit                0x00007fff9a20bf87 -[NSView interpretKeyEvents:] + 183
18  com.apple.AppKit                0x00007fff9a158f67 -[NSTextView keyDown:] + 723
19  com.apple.AppKit                0x00007fff9a374120 -[NSWindow sendEvent:] + 9687
20  com.apple.AppKit                0x00007fff9a36f744 -[NSApplication sendEvent:] + 5761
21  com.apple.AppKit                0x00007fff9a2852fa -[NSApplication run] + 636
22  com.apple.AppKit                0x00007fff9a229cb6 NSApplicationMain + 869
23  MY_BUNDLE_ID                        0x0000000100002014 0x100000000 + 8212

你知道可能出现什么问题吗? 或者你能指出我正确的方向吗?


暂且不谈:

任何人都可以指导我如何制作,例如0x00007fff90128650更多...有意义并使它(在未来的崩溃报告中)也显示该函数的名称?

3 个答案:

答案 0 :(得分:12)

您的崩溃日志为您提供了大量信息:  首先你崩溃了,因为你试图访问地址0进入你的程序,内核不满意。

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000

看,你通过它开始到0x00地址的方式得到一个分段,所以就像你直接访问0 / nil指针一样。 喜欢这个

char* adress = 0;
printf("get %p", adress); // will output 0x0
printf("get %p", adress[0]); // will make a EXC_BAD_ACCESS

你应该专注于此。

从崩溃堆栈中有三件有趣的事情:

6   com.apple.AppKit                0x00007fff9a7894a7 -[NSTableView textDidChange:] + 377
 5   com.apple.Foundation            0x00007fff8e5fe846 -[NSNotificationCenter postNotificationName:object:userInfo:] + 64
    0   libsystem_c.dylib               0x00007fff90128650 strlen + 16

[textDidChange]是导致崩溃的最后一次调用,就像你在触发[textDidChange]时发送通知一样。实际发生崩溃的最后一行:strlen + 16是因为有些东西认为它可以从有效的指针地址获取一个字符长度而事实并非如此。

根据我的说法,您应该检查您发送到通知中的内容。

_NSDoUserReplaceForCharRange
  _NSDoUserDeleteForCharRange

当你深入研究堆栈崩溃时,当你将你的单元插入/删除到你的tableViewController中时,它似乎真的出现了。您应该检查某人是否有人推送无效数据,或者不按预期的方式使用编辑单元格。

所以这是简历: 1有人编辑tableViewCell,他没有插入或代码没有插入它应该是什么。 2您发送的通知中包含无效数据。 3当触发strlen(invalid_dataStructure)时,它会使你的应用程序崩溃

顺便说一句,我只是“猜测”,因为我实际上并不知道你的代码实现。但我希望它可以为你的调试会话提供很多线索。

答案 1 :(得分:0)

通常问题是您需要“保留”属性。

您需要为调试模式启用Zombies。 在xCode 4中点击“编辑方案” - >“诊断” - >“启用僵尸对象”

它将在控制台中显示您在崩溃时尝试访问的“已删除”对象。

这应该有所帮助。

你会看到这样的事情:

2010-01-25 14:35:24.840 MyApplication[1393:20b] *** -[CFString retain]: message sent to deallocated instance 0x42a5060

您还可以启用“Malloc logging”,并在崩溃后在调试控制台中输入以下命令:

shell malloc_history 1393 0x42a5060

在那里你可以找到所有的alloc / release堆栈。只看一下release和alloc命令。

答案 2 :(得分:0)

我收到了一份非常类似的崩溃报告,试图打开图形繁重的应用程序(pymol和coot)(见下文)

我发现如果我将mac与外接显示器断开连接,程序会再次运行。我使用的是 USB-HDMI连接器 - 显然这是一个坏主意。我刚购买了microUSB-HDMI连接器,我希望它能更好用。如果我只使用我的mac book自己的监视器显示,程序就会运行。

Time Awake Since Boot: 19000 seconds
Time Since Wake:       110 seconds

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_BAD_ACCESS (SIGSEGV)
Exception Codes:       KERN_INVALID_ADDRESS at 0x0000000000000000

VM Regions Near 0:
--> 
    __TEXT                 0000000100000000-0000000100cff000 [ 13.0M] r-x/rwx SM=COW  /Applications/MacPyMOL.app/Contents/MacOS/MacPyMOL

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   com.apple.opengl                0x00007fff8333857c CGLDescribeRenderer + 79
1   com.schrodinger.macpymol        0x000000010083c5b4 CheckOpenGLCaps + 484
2   com.schrodinger.macpymol        0x000000010084cd8c -[PyMOLOpenGLView awakeFromNib] + 1420
3   com.apple.CoreFoundation        0x00007fff8a10785f -[NSSet makeObjectsPerformSelector:] + 223
4   com.apple.AppKit                0x00007fff88b935cd -[NSIBObjectData nibInstantiateWithOwner:options:topLevelObjects:] + 1216
5   com.apple.AppKit                0x00007fff886a3605 loadNib + 384
6   com.apple.AppKit                0x00007fff88c14749 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:options:withZone:ownerBundle:] + 727
7   com.apple.AppKit                0x00007fff88c14ca8 +[NSBundle(NSNibLoadingInternal) _loadNibFile:externalNameTable:options:withZone:] + 150
8   com.apple.AppKit                0x00007fff886a2bc0 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 631
9   com.schrodinger.macpymol        0x000000010084d77b main + 1499
10  com.schrodinger.macpymol        0x0000000100007494 start + 52