【发布时间】:2013-04-16 04:42:34
【问题描述】:
我正在尝试记录我的应用程序中发生的所有崩溃。我写了一个signalHandler 和一个exceptionHandler。我正在为 sys/signal.h 文件中定义的所有信号注册 signalHandler。我在 SIGABRT、SIGUSR1 等上调用了我的 signalHandler 方法。
问题是,我有时会收到一些奇怪的信号,这些信号并没有调用我的 signalHandler。一个示例是 EXC_BAD_ACCESS(代码=1 或 2,地址='某个内存地址')。 我已经用 signalHandler 注册了 SIGSEGV;事实上,我已经在 sys/signal.h 文件中注册了所有定义的信号。
如果您想创建这个 EXC_BAD_ACCESS (code=1, address=0x00XXXXXX) 信号,只需在您的应用中编写以下代码行,
NSLog(@"Stupid Log %@ %@");
有人可以帮我捕捉这些信号吗?
提前致谢,
苏拉杰
【问题讨论】:
-
我认为您无法捕捉到分段错误。当它发生时,你的程序已经严重破坏了内存中的某些东西,以至于它没有机会恢复,唯一可以做的就是操作系统杀死进程。尝试编写没有内存管理错误的好代码,这样会更加强大和优雅。
-
您应该使用 crashlytics。它是用于跟踪和调试崩溃的绝佳工具。
-
@H2CO3,我明白了,最好的办法是写出没有内存管理错误的好代码。但是,如您所知,每个人都会犯一些错误。就我而言,我犯了很多错误。有一个备份计划,比如记录所有的崩溃,以防我们犯了一些可怕的内存管理错误,这将是非常好的。那么这个信号是因为分段错误而出现的吗?
-
@Suran 是的,确实如此。如果你犯了很多错误,那么你应该使用调试器而不是试图在代码本身中变魔术。我有时会遇到段错误,我也是,不要以为我没有。但是我只是启动了 GDB。
-
@H2CO3,信号 SIGSEGV 表示分段错误,对吗?我们可以处理 SIGSEGV 信号。但是,只有括号中带有此“代码”的 EXC_BAD_ACCESS 不会被捕获。任何想法,为什么会这样?你能帮我正确理解吗?
标签: iphone ios objective-c exception signals