【问题标题】:Debug "exc_bad_access" with NSZombie使用 NSZombie 调试“exc_bad_access”
【发布时间】:2015-02-17 09:11:22
【问题描述】:

我尝试使用 NSZombie 调试“exc_bad_access”。这些错误来自 sqlite3。 我已经在 xCode/editScheme/Diagnostics 中启用了僵尸对象。 使用 Instruments (Zombies) 运行应用程序会在控制台框架中显示此消息:

(1330,0x2581000) malloc: *** error for object 0x4c3ea00: non-page-aligned, non-allocated  pointer being freed
*** set a breakpoint in malloc_error_break to debug
<End of Run>

我的问题是如何找到导致该问题的对象(此处:0x4c3ea00)?如果你知道另一种使用 NSZombie 的方式,请告诉我。谢谢

【问题讨论】:

  • 如果您在 xcode 中单击并按住播放(运行)按钮,您将看到 Prifile 图标选择它并运行它会出现一个窗口,底部会出现僵尸
  • 我怀疑 NSZombie 是否会帮助解决来自 SQLite 的错误。 SQLite 自己进行存储管理,您可能违反了它的一条规则。 (但是您是否按照说明设置了断点?知道您在哪里得到错误可能会有所帮助。)
  • 是的,我放了断点,我知道哪一行是行,但我不知道如何解决: int sqlResult = sqlite3_prepare_v2(_contactDB, sql_stmt_getBillingAccount, -1, &sqlStatement, NULL);

标签: ios objective-c xcode sqlite


【解决方案1】:

您可以通过在 Xcode 中编辑方案来启用 NSZombie。您也可以通过 Xcode 添加异常断点。参考图片定位添加异常断点的位置。

【讨论】:

  • 谢谢,但不是我的问题。我已经启用了 NSZombie。如何使用 Instruments/Zombies/Console 中显示的消息找出产生错误的对象?
  • 我知道你正在通过仪器使用僵尸。我要求通过编辑方案使用。加上使用异常断点,它会告诉你代码在哪里崩溃,然后你可以自己反省哪个对象被释放。否则别无选择
  • 谢谢,我添加了异常断点。这个想法是代码很少崩溃,我想很容易使用 NSZombie 找出哪个是对象。但我不知道如何解释仪器在控制台中显示的消息。
【解决方案2】:

消息告诉你。

转到断点并在malloc_error_break 上添加一个符号断点。

当断点触发时,导致错误的代码将在堆栈跟踪中。

【讨论】:

  • 谢谢,我这样做了,现在代码停止为: int sqlResult = sqlite3_prepare_v2(_contactDB, sql_stmt_getBillingAccount, -1, &sqlStatement, NULL);线程 4:Exc_bad_access(代码=1,地址=0x14)。我如何找出对象是哪一个?
  • @Developer3000 无法在没有看到更多代码的情况下告诉您,但我怀疑以前的 sqlStatement 尚未使用 sqlite3_finalize() 释放。
  • 谢谢,我只是检查了一下,没问题。但是,我应该使用“int”还是 NSInteger 来存储响应?
  • @Developer3000 没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 2011-06-09
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多