【问题标题】:Thread1: Program Received Signal "SIGBRT"Thread1:程序接收信号“SIGABRT”
【发布时间】:2012-06-05 19:31:38
【问题描述】:

我正在使用 ios 5 上的 sqlite 数据库。我的应用程序所做的是它在文本字段中获取字符串并将其保存到数据库中。当我运行该应用程序时,它会崩溃并给出以下警告:

Thread1:程序接收到信号“SIGBRT”

它在 main.m 和这一行中给出了这个:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

有人可以帮我吗?将不胜感激! :( 我使用的是 xcode 4.2。

这是编译器说发生断言失败的方法。

- (void) addstrings{    
    if(addStmt == nil) {
    const char *sql = "insert into strings(strings) Values(?)";
    if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
        NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
    }

    sqlite3_bind_text(addStmt, 1, [strings UTF8String], -1, SQLITE_TRANSIENT);

    if(SQLITE_DONE != sqlite3_step(addStmt))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    else
        //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
        strID = sqlite3_last_insert_rowid(database);

    //Reset the add statement.
    sqlite3_reset(addStmt);
}

【问题讨论】:

  • “保存到数据库”是指直接调用 SQLite,还是使用 CoreData?无论哪种情况,在保存点附近查看相关代码都会有所帮助。
  • 我正在使用 sqlite 3 @wadesworld。我已经检查了很多次代码但没有任何线索:(
  • 能否将堆栈跟踪添加到问题中。

标签: objective-c ios5 sqlite xcode4.2


【解决方案1】:

如果没有更多信息,就不可能准确地判断程序中发生了什么,但调用 abort() 的最常见原因是:

  1. 您向不支持/实现该消息的 Objective-C 对象发送消息。这会导致可怕的“无法识别的选择器发送到实例”错误。
  2. 您在某处有一个失败的断言。在定义宏 NDEBUG 的非调试版本中,标准库宏 assert(3) 在断言失败时调用 abort()。
  3. 您有一些内存踩踏/分配错误。当 malloc/free 检测到损坏的堆时,可能会调用 abort()。 这意味着:您正在释放已经完成的内存,可能是通过向对象发送太多释放消息。另一件事是您可能无法将对象连接到 nib 中的 IBOutlet。我真的不能说,因为除了报告的错误之外,您没有提供任何其他信息。

  4. 您正在引发未捕获的异常(C++ 异常或 Objective-C 异常)。

在几乎所有情况下,调试控制台都会为您提供更多关于导致 abort() 被调用的原因的信息,因此请务必查看那里。

【讨论】:

  • 调试控制台显示断言失败。你能告诉我在这种情况下可能出了什么问题吗?另外我正在使用启用 ARC,所以我没有使用任何明确的版本或 delloc 等。你能指导我吗?
  • 请再看一遍问题。我已经对其进行了编辑并进行了一些更改。
【解决方案2】:

SIGABRT 错误可能在各种情况下发生,

就像你试图在不打开 DB 的情况下关闭 DB,或者试图在不打开 DB 的情况下向 DB 写入一些值一样。

或者可能是几个原因,所以在这里贴一些代码。

【讨论】:

  • 我编辑了问题并添加了编译器发现错误的方法的代码。请指导我问题出在哪里。谢谢。
  • const char *sql = "insert into strings(strings) Values(?)"; 将用什么值代替(?)
  • 你在哪里得到断言失败?在创建添加语句或插入数据时?
  • 代替 (?),文本字段中的字符串值将被保存。
  • NSLog("sql query=%@",sql)并复制此查询并将其放入sqlite并检查它是否工作?
猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
相关资源
最近更新 更多