복붙노트

[SQL] IOS : 이상의 원인을 조기 메모리 해제 번만 sqlite가 동일한 매개 변수를 사용하여

SQL

IOS : 이상의 원인을 조기 메모리 해제 번만 sqlite가 동일한 매개 변수를 사용하여

노트 : 문제는 내가 그것을 메모리 오류가 발생 하나 개 이상의 매개 변수를 사용하여 줄 알았는데 .. 오해의 소지가있다 ..하지만 그 이유는 아니다 .. 이유 .. 잘못 형성된 SQL 문을이었다 아래의 대답을 참조하십시오.

더 예를 한 번 이상 같은 매개 변수를 사용하는 sqlite가 문을 작성하는 경우

    NSString* updateStmt = @"INSERT INTO search_email(..., subject, ...)"
    " SELECT ..., :subject, ...,"
    " coalesce((SELECT search_email.threadID "
    " FROM search_email "
    " WHERE search_email.subject MATCH :subject2 "
    " ),"
    " :uid"
    " )";

int subjectIndex = sqlite3_bind_parameter_index(searchEmailInsertStmt,":subject");
int subjectIndex2 = sqlite3_bind_parameter_index(searchEmailInsertStmt,":subject2");

...    
sqlite3_bind_text(searchEmailInsertStmt, subjectIndex, [subject UTF8String], -1, SQLITE_TRANSIENT);        // subject
sqlite3_bind_text(searchEmailInsertStmt, subjectIndex2, [subjectCopy UTF8String], -1, SQLITE_TRANSIENT);        // search_email.subject


if (sqlite3_step(searchEmailInsertStmt) != SQLITE_DONE) {
    NSLog(@"Failed step in searchEmailInsertStmt: '%s', '%i'", sqlite3_errmsg([[AddEmailDBAccessor sharedManager] database]), pk);
}

그것은 다음과 같은 오류와 충돌 : malloc에 ​​: 오브젝트 0x9b6350에 대한 *** 오류 : 포인터가 할당되지 않은 해제되고 *** 디버깅 malloc_error_break에 중단 점을 설정

어떤 생각이 왜?

최신 정보: 문자열 상수는 즉와 내가 제목과 subjectCopy를 교체하면 @ "subject1"와 @ "subject2를"그것은 잘 작동합니다 ..하지만 어떤 이유로 나는 프로그램 즉,이 복제 시도

NSString* subjectCopy = [NSString alloc];
subjectCopy = [subject retain];

그 일의 아무도 .. SQLITE_STATIC에도 변화 SQLITE_TRANSIENT는 효과가 없습니다.

업데이트 2 : malloc_error_break에서 깨는 후 BT의 출력 :

thread #6: tid = 0x2503, 0x99a20815 libsystem_c.dylib`malloc_error_break, stop reason = breakpoint 1.1
frame #0: 0x99a20815 libsystem_c.dylib`malloc_error_break
frame #1: 0x99a21d51 libsystem_c.dylib`free + 346
frame #2: 0x0005d5e8 reMail`sqlite3MemFree + 40 at sqlite3.c:12272
frame #3: 0x0002a53e reMail`sqlite3_free + 126 at sqlite3.c:15653
frame #4: 0x0004e670 reMail`sqlite3Fts3ExprFree + 64 at sqlite3.c:101490
frame #5: 0x0004e665 reMail`sqlite3Fts3ExprFree + 53 at sqlite3.c:101489
frame #6: 0x0003fbf1 reMail`fulltextClose + 49 at sqlite3.c:97401
frame #7: 0x000b48f3 reMail`sqlite3VdbeFreeCursor + 163 at sqlite3.c:47461
frame #8: 0x000aebb8 reMail`sqlite3VdbeExec + 17576 at sqlite3.c:54042
frame #9: 0x00032273 reMail`sqlite3Step + 467 at sqlite3.c:49459
frame #10: 0x00031f5e reMail`sqlite3_step + 78 at sqlite3.c:49531
frame #11: 0x000ff2ae reMail`-[EmailProcessor insertIntoSearch:withMetaString:withUid:withSubject:withBody:withFrom:withTo:withCc:withFolder:] + 1854 at EmailProcessor.m:934
frame #12: 0x001005a1 reMail`-[EmailProcessor addEmail:] + 3153 at EmailProcessor.m:1015
frame #13: 0x000fd673 reMail`-[EmailProcessor addEmailWrapper:] + 4035 at EmailProcessor.m:651
frame #14: 0x0324c1bd CoreFoundation`__invoking___ + 29
frame #15: 0x0324c0d6 CoreFoundation`-[NSInvocation invoke] + 342
frame #16: 0x017c36b5 Foundation`-[NSInvocationOperation main] + 45
frame #17: 0x01738d23 Foundation`-[__NSOperationInternal start] + 736
frame #18: 0x01738a34 Foundation`-[NSOperation start] + 79
frame #19: 0x017c5301 Foundation`__block_global_6 + 150
frame #20: 0x02ec053f libdispatch.dylib`_dispatch_call_block_and_release + 15
frame #21: 0x02ed2014 libdispatch.dylib`_dispatch_client_callout + 14
frame #22: 0x02ec32e8 libdispatch.dylib`_dispatch_root_queue_drain + 335
frame #23: 0x02ec3450 libdispatch.dylib`_dispatch_worker_thread2 + 39
frame #24: 0x99a09e12 libsystem_c.dylib`_pthread_wqthread + 441

해결법

  1. ==============================

    1.나는 마침내 그것을 발견! 많은 붉은 청어를 쫓는 후 .. 내가 가진 최고의 조언 SQLite는 대한 전문 포럼에 있던 : 지점 내 디버깅 손이 닿지 SQLite는 밖으로의 내장을 유지했다, 그 그것의 SQLite는의 잘못이 매우 확률이 낮다.

    나는 마침내 그것을 발견! 많은 붉은 청어를 쫓는 후 .. 내가 가진 최고의 조언 SQLite는 대한 전문 포럼에 있던 : 지점 내 디버깅 손이 닿지 SQLite는 밖으로의 내장을 유지했다, 그 그것의 SQLite는의 잘못이 매우 확률이 낮다.

    나는 기본적으로 작은 조각으로 내 SQL 문을 휴식과 각 자신의 실행하기로 결정했다 :

    메모리 문제를 일으킨 원래의 SQL 문 :

        NSString* updateStmt = @"INSERT INTO search_email(docid, meta, subject, body, sender, tos, ccs, folder, threadid)"
        " SELECT ?, ?, ?, ?, ?, ?, ?, ?,"
        " coalesce((SELECT search_email.threadID "
        " FROM search_email "
        " WHERE search_email.subject MATCH ?  UNION SELECT * FROM "
        " (SELECT threadID FROM  (SELECT threadID FROM search_email WHERE search_email.sender MATCH ? "
        " INTERSECT SELECT threadID FROM search_email WHERE search_email.tos MATCH ? ) "
        "  UNION "
        " SELECT threadID FROM (SELECT threadID FROM search_email WHERE search_email.sender MATCH ? "
        "       INTERSECT SELECT threadID FROM search_email WHERE search_email.tos MATCH ?)) "
        " LIMIT 1"
        " ),"
        " ?"
        " )";
    

    내가 맞게 특수 문자 문자열을 제공 할 때마다 문제가 발생 .. 다음은 MATCH로 전송 문제가 매개 변수의 예입니다 :

    sabaho :) 2월 1일을위한 새로운 코어 오디오 질문 - 스택 교환 참고; 데이터 중심의 테스트 / ETL 테스터 oppurtunity을 시카고, 일리노이에서.

    그래서 단순히 정상 = 비교와 MATCH를 대체 ..하지만 첫 번째 정규식을 사용하여 매개 변수를 정리하는 것이 주위 이동합니다 :

    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"re:(\\s)*"
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:&error];
    
    
                                error:&error];
    
    NSString *filteredSubjectFromRe = [regex stringByReplacingMatchesInString:subject
                                                                      options:0
                                                                        range:NSMakeRange(0, [subject length])
                                                                 withTemplate:@""];
    
    if(searchEmailInsertStmt == nil) {
    
        NSString* updateStmt = @"INSERT INTO search_email(docid, meta, subject, body, sender, tos, ccs, folder, threadid)"
        " SELECT ?, ?, ?, ?, ?, ?, ?, ?,"
        " coalesce((SELECT search_email.threadID "
        " FROM search_email "
        " WHERE search_email.subject = ? UNION SELECT * FROM "
        " (SELECT threadID FROM  (SELECT threadID FROM search_email WHERE search_email.sender = ? "
        " INTERSECT SELECT threadID FROM search_email WHERE search_email.tos = ? ) "
        "  UNION "
        " SELECT threadID FROM (SELECT threadID FROM search_email WHERE search_email.sender = ? "
        "       INTERSECT SELECT threadID FROM search_email WHERE search_email.tos = ?)) "
        " LIMIT 1"
        " ),"
        " ?"
        " )";
    
  2. from https://stackoverflow.com/questions/14462951/ios-using-the-same-sqlite-parameter-more-than-once-causes-premature-memory-deal by cc-by-sa and MIT license