【问题标题】:How to catch EXC_BAD_ACCESS (code=1, address=0x00XXXXXX)?如何捕获 EXC_BAD_ACCESS(代码=1,地址=0x00XXXXXX)?
【发布时间】: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


【解决方案1】:

【讨论】:

  • 实际上,我正在尝试找到一种方法来处理 EXC_BAD_ACCESS (code=1,...) 崩溃。我提供的 NSLog 就是为了造成这样的崩溃。
  • @Suran:对不起,我误读了这个问题。已提及此:stackoverflow.com/questions/10315526/…stackoverflow.com/questions/15513864/…
  • 谢谢,第一个链接有帮助。断开设备与 XCode/Mac 的连接后,在运行应用程序时会调用 signalHandler。请编辑您的答案以包含链接,我会接受答案。
  • @Suran:很高兴听到它对你有帮助。
猜你喜欢
  • 2016-09-21
  • 2018-03-13
  • 2013-10-11
  • 2019-07-11
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多