>> On Sep 1, 2015, at 9:37 AM, Roger Binns <rogerb at rogerbinns.com> wrote:
>>
>> On 08/31/2015 11:28 PM, Jeff M wrote:
>> All my bad -- I'm fessing up.
>
> Can you tell us how you found the root causes of the problems? It
> would be nice to know what tools and techniques worked.
> Roger
Since you asked...
The crash investigation: Many of the stack traces showed the ESC_BAD_ACCESS
was at a harmless looking objectForKey: call, so I added a dozen more
objectForKey: calls at the same place on the main thread to make it crash more
often, then I moved the setObject:forKey: back and forth between the background
thread and the main thread. It almost always crashed when on the background
thread, but never crashed when on the main thread. I searched
stackoverflow.com for things like "objectForKey: crash" and found several
threads describing my situation. The answers quoted Apple docs saying that
NSMutableDictionary was not thread safe, and I should have known that.
Stackoverflow.com is a terrific resource. [Xcode's stack trace was misleading
because it often appeared that the crash was in sqlite3_step(), and that led to
my initial post here.]
For the memory allocation issue, I used Instruments to list the objects and
mallocs that were unbalanced ("persistent"), and most of them were mallocs in
SQLite. I knew that SQLite would *not* have a bug like this, thus it had to be
my mistake (I was only in denial for few hours :-), so I just kept picking at
my code. The problem went away when I finalized each prepared statement
immediately after the existing reset (a trivial change). That led me to places
where I was mishandling a pointer to a prepared statement pointer (so it was a
pointer to a pointer, but my prepare code was treating it as only a pointer),
causing several statements to be prepared dozens of times, while finalizing
none of them. Just a case of clever code hiding something sinister.
Jeff