如何在 Xcode 堆栈跟踪中查找 NSInternalInconsistencyException 的来源
How to Find the Source of an NSInternalInconsistencyException in an Xcode Stack Trace
我正在 Objective-C 开发一个 iPhone 应用程序(使用 Xcode 6.1.1 和 Parse),我刚得到这个神秘的 NSInternalInconsistencyException
:
Caught "NSInternalInconsistencyException" with reason "Tried to save an object with a pointer to a new, unsaved object.":
所以我对 Stack Overflow 社区的问题是:
有人如何阅读此堆栈跟踪以找出问题的实际根源?我在此堆栈跟踪中的任何地方都看不到任何可识别的文件名、方法调用或行号。
或者,如果这不是简单地读取堆栈跟踪的问题,而是涉及其他技术,那么开发人员应该采取什么适当的下一步来追踪此类错误的来源?
这是输出到我的控制台的完整堆栈跟踪:
2015-07-18 02:01:17.596 testapp[1276:60b] [Error]: Caught "NSInternalInconsistencyException" with reason "Tried to save an object with a pointer to a new, unsaved object.":
(
0 CoreFoundation 0x2f547f9b + 154
1 libobjc.A.dylib 0x39c94ccf objc_exception_throw + 38
2 CoreFoundation 0x2f547ec5 + 0
3 testapp 0x00205a29 -[PFObject(Private) resolveLocalId] + 384
4 testapp 0x00233d6d __32-[PFRESTCommand resolveLocalIds]_block_invoke + 24
5 testapp 0x00233783 +[PFRESTCommand forEachLocalIdIn:doBlock:] + 642
6 testapp 0x00233ba7 __42+[PFRESTCommand forEachLocalIdIn:doBlock:]_block_invoke + 62
7 CoreFoundation 0x2f484043 + 98
8 CoreFoundation 0x2f483f67 + 162
9 testapp 0x0023367f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 382
10 testapp 0x00233ba7 __42+[PFRESTCommand forEachLocalIdIn:doBlock:]_block_invoke + 62
11 CoreFoundation 0x2f484043 + 98
12 CoreFoundation 0x2f483f67 + 162
13 testapp 0x0023367f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 382
14 testapp 0x0023373f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 574
15 testapp 0x00233ba7 __42+[PFRESTCommand forEachLocalIdIn:doBlock:]_block_invoke + 62
16 CoreFoundation 0x2f484043 + 98
17 CoreFoundation 0x2f483f67 + 162
18 testapp 0x0023367f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 382
19 testapp 0x00233ca3 -[PFRESTCommand forEachLocalId:] + 162
20 testapp 0x00233d3f -[PFRESTCommand resolveLocalIds] + 34
21 testapp 0x0023ee2f -[PFRESTCommandRunner _runCommandAsync:withCancellationToken:] + 110
22 testapp 0x0023e8c7 -[PFRESTCommandRunner runCommandAsync:withOptions:cancellationToken:] + 174
23 testapp 0x0023e7d7 -[PFRESTCommandRunner runCommandInBackground:inOperation:] + 42
24 testapp 0x00203667 __65+[PFObject(Private) _deepSaveAsync:withCurrentUser:sessionToken:]_block_invoke_3 + 766
25 testapp 0x002854b3 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_2 + 214
26 libdispatch.dylib 0x3a17c833 + 10
27 libdispatch.dylib 0x3a183ad7 + 222
28 libdispatch.dylib 0x3a183d29 + 56
29 libsystem_pthread.dylib 0x3a2bebd3 _pthread_wqthread + 298
30 libsystem_pthread.dylib 0x3a2bea98 start_wqthread + 8
).
感谢您提供给我的任何帮助和见解。
NSInternalInconsistencyException
当代码进入不应该发生的状态时抛出。通常它表示编写它的人犯了一个错误,但有时可能会因误用库(例如,按照文档所说的做某事)而导致这种情况。
换句话说,这是一个错误,但如果不是您编写抛出它的代码,它可能不是您的。从这个特定的堆栈跟踪,问题必须在 Parse 中。
向原始开发人员报告错误。一个好的图书馆绝不能扔掉它,不管你是否滥用它。在他们修复它之前,您能做的最好的事情就是尝试通过以某种不同的方式做您尝试做的事情来解决它。如果你有那个库的源,你可以尝试自己调试和修复问题。
这个特殊的例子并没有给开发者太多的继续。所以,在这种情况下,你的问题的答案是 "Google it." 实际上,堆栈跟踪中最好的线索是:
[PFObject(Private) _deepSaveAsync:withCurrentUser:sessionToken:]
上一行表示使用 currentUser
保存失败,结合错误消息 "Tried to save an object with a pointer to a new, unsaved object." 应该足以指出可能的原因。
事实证明,这个错误并不少见,令人困惑的是为什么 Parse 没有修复它。这通常是由于您的应用程序使用匿名 Parse 用户并尝试在保存用户对象之前保存对象而引起的。由于用户对象没有保存,所以没有objectId
,其他对象保存失败
解决方法是检查currentUser
对象是否有objectId
,如果没有,先保存再尝试写入Parse。
// Prevent race condition for unsaved user
// Courtesy of: http://samwize.com/2014/07/15/pitfall-with-using-anonymous-user-in-parse/
if ([PFUser currentUser].objectId == nil) {
[[PFUser currentUser] saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
//do stuff later
}];
} else {
//do stuff now
}
当您看到此类错误并且 Xcode 将您踢到 AppDelegate 时,请尝试放入 Xcode 2 种断点
- Swift 错误断点
- 异常断点...
您会在顶部的左侧面板中找到这些选项
Breakpoint Navigator -> +(这个符号位于底部)-> Swift Error Breakpoint or/and Exception Breakpoint
希望下次能帮到你
我正在 Objective-C 开发一个 iPhone 应用程序(使用 Xcode 6.1.1 和 Parse),我刚得到这个神秘的 NSInternalInconsistencyException
:
Caught "NSInternalInconsistencyException" with reason "Tried to save an object with a pointer to a new, unsaved object.":
所以我对 Stack Overflow 社区的问题是:
有人如何阅读此堆栈跟踪以找出问题的实际根源?我在此堆栈跟踪中的任何地方都看不到任何可识别的文件名、方法调用或行号。
或者,如果这不是简单地读取堆栈跟踪的问题,而是涉及其他技术,那么开发人员应该采取什么适当的下一步来追踪此类错误的来源?
这是输出到我的控制台的完整堆栈跟踪:
2015-07-18 02:01:17.596 testapp[1276:60b] [Error]: Caught "NSInternalInconsistencyException" with reason "Tried to save an object with a pointer to a new, unsaved object.": ( 0 CoreFoundation 0x2f547f9b + 154 1 libobjc.A.dylib 0x39c94ccf objc_exception_throw + 38 2 CoreFoundation 0x2f547ec5 + 0 3 testapp 0x00205a29 -[PFObject(Private) resolveLocalId] + 384 4 testapp 0x00233d6d __32-[PFRESTCommand resolveLocalIds]_block_invoke + 24 5 testapp 0x00233783 +[PFRESTCommand forEachLocalIdIn:doBlock:] + 642 6 testapp 0x00233ba7 __42+[PFRESTCommand forEachLocalIdIn:doBlock:]_block_invoke + 62 7 CoreFoundation 0x2f484043 + 98 8 CoreFoundation 0x2f483f67 + 162 9 testapp 0x0023367f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 382 10 testapp 0x00233ba7 __42+[PFRESTCommand forEachLocalIdIn:doBlock:]_block_invoke + 62 11 CoreFoundation 0x2f484043 + 98 12 CoreFoundation 0x2f483f67 + 162 13 testapp 0x0023367f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 382 14 testapp 0x0023373f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 574 15 testapp 0x00233ba7 __42+[PFRESTCommand forEachLocalIdIn:doBlock:]_block_invoke + 62 16 CoreFoundation 0x2f484043 + 98 17 CoreFoundation 0x2f483f67 + 162 18 testapp 0x0023367f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 382 19 testapp 0x00233ca3 -[PFRESTCommand forEachLocalId:] + 162 20 testapp 0x00233d3f -[PFRESTCommand resolveLocalIds] + 34 21 testapp 0x0023ee2f -[PFRESTCommandRunner _runCommandAsync:withCancellationToken:] + 110 22 testapp 0x0023e8c7 -[PFRESTCommandRunner runCommandAsync:withOptions:cancellationToken:] + 174 23 testapp 0x0023e7d7 -[PFRESTCommandRunner runCommandInBackground:inOperation:] + 42 24 testapp 0x00203667 __65+[PFObject(Private) _deepSaveAsync:withCurrentUser:sessionToken:]_block_invoke_3 + 766 25 testapp 0x002854b3 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_2 + 214 26 libdispatch.dylib 0x3a17c833 + 10 27 libdispatch.dylib 0x3a183ad7 + 222 28 libdispatch.dylib 0x3a183d29 + 56 29 libsystem_pthread.dylib 0x3a2bebd3 _pthread_wqthread + 298 30 libsystem_pthread.dylib 0x3a2bea98 start_wqthread + 8 ).
感谢您提供给我的任何帮助和见解。
NSInternalInconsistencyException
当代码进入不应该发生的状态时抛出。通常它表示编写它的人犯了一个错误,但有时可能会因误用库(例如,按照文档所说的做某事)而导致这种情况。
换句话说,这是一个错误,但如果不是您编写抛出它的代码,它可能不是您的。从这个特定的堆栈跟踪,问题必须在 Parse 中。
向原始开发人员报告错误。一个好的图书馆绝不能扔掉它,不管你是否滥用它。在他们修复它之前,您能做的最好的事情就是尝试通过以某种不同的方式做您尝试做的事情来解决它。如果你有那个库的源,你可以尝试自己调试和修复问题。
这个特殊的例子并没有给开发者太多的继续。所以,在这种情况下,你的问题的答案是 "Google it." 实际上,堆栈跟踪中最好的线索是:
[PFObject(Private) _deepSaveAsync:withCurrentUser:sessionToken:]
上一行表示使用 currentUser
保存失败,结合错误消息 "Tried to save an object with a pointer to a new, unsaved object." 应该足以指出可能的原因。
事实证明,这个错误并不少见,令人困惑的是为什么 Parse 没有修复它。这通常是由于您的应用程序使用匿名 Parse 用户并尝试在保存用户对象之前保存对象而引起的。由于用户对象没有保存,所以没有objectId
,其他对象保存失败
解决方法是检查currentUser
对象是否有objectId
,如果没有,先保存再尝试写入Parse。
// Prevent race condition for unsaved user
// Courtesy of: http://samwize.com/2014/07/15/pitfall-with-using-anonymous-user-in-parse/
if ([PFUser currentUser].objectId == nil) {
[[PFUser currentUser] saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
//do stuff later
}];
} else {
//do stuff now
}
当您看到此类错误并且 Xcode 将您踢到 AppDelegate 时,请尝试放入 Xcode 2 种断点
- Swift 错误断点
- 异常断点...
您会在顶部的左侧面板中找到这些选项
Breakpoint Navigator -> +(这个符号位于底部)-> Swift Error Breakpoint or/and Exception Breakpoint
希望下次能帮到你