我有一个应用程序,没有附加debugging器的设备上运行得很好。 但是,在Eclipse中debugging时遇到问题: 当主线程暂停大约10秒或更长时间(例如,在遇到断点后),主线程会抛出一个SIGABRT,显然来自libc。 我能想到的唯一解释是主线程上的消息队列在不被轮询时会溢出来自另一个线程的消息。 但是,当主线程暂停时,我看不到堆的增长。 而且,虽然我的应用在所有服务,内容提供者,广播接收者,http和地图工作者线程等之间有大约20个线程,但是我不能真正想到任何过多的消息来源。 所以我的问题是:如何解决这个问题? 我可以使用哪些工具,以及如何查找导致我的应用在debugging器中暂停时崩溃的原因? 编辑1: logcat中唯一的是: 02-05 22:23:54.861: I/dalvikvm(26795): threadid=3: reacting to signal 3 02-05 22:23:54.901: D/dalvikvm(26795): threadid=1: still suspended after undo (sc=1 dc=1) 02-05 22:23:54.901: I/dalvikvm(26795): Wrote stack traces to '/data/anr/traces.txt' 02-05 22:23:58.905: A/libc(26795): Fatal signal 6 (SIGABRT) at 0x000002f5 (code=0), thread 26795 (om.myapp) 编辑2: 进一步的调查导致我相信这是Android故意杀死我的过程,因为它错误地认为UI线程被挂起。 问题不在我的应用程序。 所以现在我的问题是:如何在debugging时阻止Android杀死我的进程?
第一次启动应用程序,一切似乎运行良好。 我会打停止button,做一些工作,当我再次启动它,它似乎崩溃之前,甚至可以加载任何东西。 按停止键,再次点击运行,它工作正常。 直到我重复这个过程。 这是xcode突出显示与“线程1:信号SIGABRT”错误的地方。 这里显然没有用。 int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([PokerAppDelegate class])); } } debugging控制台除了(lldb)之外什么都没有显示(所以我想停止,而不是崩溃在这一点)所以,当我执行一个BT这是我得到的: (lldb) bt * thread #1: tid = 0x1c03, 0x9a258a6a libsystem_kernel.dylib`__pthread_kill + 10, stop reason = signal SIGABRT frame #0: 0x9a258a6a libsystem_kernel.dylib`__pthread_kill + 10 frame #1: 0x99ea1b2f libsystem_c.dylib`pthread_kill + 101 frame #2: 0x04a7057b […]
我正在向这个问题展示代码,举例来说,但是我的问题真的是:我该如何追踪和理解SIGABRT错误? 我读了这个问题: sigabrt没有错误信息 ,但我不认为这涉及到我的问题。 我将在下面显示的例子显然不是一个xib问题,以前得到SIGABRT似乎更多的是处理未处理的exception。 我曾尝试使用GDB的bt但这并没有帮助。 有没有更全面的转储来查看? 我也使用NSZombie ,但我真的不明白如何使用它,所以如果这是你的答案,请提供一个链接到我应该如何从中获取相关数据的文档。 这是我的例子:我试图使用核心数据。 我的项目最初并没有设置它,所以我不得不手动添加它,我通过去我的项目>构build阶段>链接二进制与库>点击加号并添加CoreData.framework 然后,通过转到文件>新build>数据模型创build我的数据模型。 我创造了不less属性,就是这样 之后,我将适当的方法添加到应用程序委托(我通过创build一个新的项目与核心数据,然后复制方法): //code removed, as its not needed for the question/answer 在此之后,我只是试图保存一个值到托pipe对象(再次,从一个新的项目从默认实现复制的代码): //code removed, as its not needed for the question/answer 但是,当我执行addTime方法时,我得到的是SIGABRT错误。
什么情况下,一个进程得到一个SIGABRT在C + +? 这个信号是否始终来自过程中,还是可以将这个信号从一个过程发送到另一个过程? 有没有办法确定哪个进程发送这个信号?
我目前正试图保存一个自定义的Swift类到NSUserDefaults。 这里是我的游乐场的代码: import Foundation class Blog : NSObject, NSCoding { var blogName: String? override init() {} required init(coder aDecoder: NSCoder) { if let blogName = aDecoder.decodeObjectForKey("blogName") as? String { self.blogName = blogName } } func encodeWithCoder(aCoder: NSCoder) { if let blogName = self.blogName { aCoder.encodeObject(blogName, forKey: "blogName") } } } var blog = Blog() blog.blogName […]