Actually, looking again, I was running the profile on the device, not the 
simulator as I had meant to.

One other thing I meant to mention is that I keep three instances of the 
UIWebView loaded, and I trigger it by paging between them quickly, so perhaps 
it's an issue with multiple instances? There is always one on screen, and 
paging from one to the next allocates a new one while an old one is discarded. 
They all appear to share the same WebThread & JavaScript threads, so I could 
see that being problematic.

- Ian

On Dec 11, 2014, at 9:25 PM, Ian Ragsdale <ian.ragsd...@gmail.com> wrote:
> 
> Hi Geoff, thanks for the quick response!
> 
> I don't believe I'm making any use of SPI, aside from whatever underlying use 
> there is in UIWebView - I'm pretty sure that's not exposed to normal iOS apps 
> (at least not that I'm aware of).
> 
> As predicted, setting JSC_slowPathAllocsBetweenGCs does appear to make it 
> easier to trigger the crash. I did that and then did an Instruments sample 
> using the iOS simulator, and got the crash to happen pretty quickly. However, 
> I'm not really sure what to look for, since I'm a newbie to WebKit internals. 
> Any suggestions for what to look for in the call tree?
> 
> Thanks again,
> Ian
> 
>> On Dec 11, 2014, at 8:11 PM, Geoffrey Garen <gga...@apple.com> wrote:
>> 
>> Hi Ian.
>> 
>>> From looking at the source, it tries to drop all locks from the current 
>>> javascript VM before calling the delegate, and when it does that it asserts 
>>> if the VM is busy garbage collecting.
>> 
>> That’s right.
>> 
>>> I'm guessing there needs to be some sort of guard there to make sure the VM 
>>> isn't doing GC before dropping the locks?
>> 
>> In JavaScriptCore, garbage collection is an atomic operation that must run 
>> to completion before the next allocation.
>> 
>> The reason this is an assertion — and can’t be a guard — is that, if we 
>> called out to a delegate in the middle of garbage collection, we would 
>> definitely corrupt the heap. So, there’s nothing you can guard against: the 
>> game is already lost.
>> 
>> The bug here happened earlier: Somehow, the collector was left thinking that 
>> it was in the busy state, even though — as we can see from the backtrace — 
>> it wasn’t actually doing anything.
>> 
>>> I'm pretty positive I'm not calling into the UIWebView from any thread 
>>> other than the main thread, and I don't think I have any control over the 
>>> WebThread or the GC threads, so I'm not sure if there's anything I can do, 
>>> but I do have a fairly reliable repro, so if there's something it makes 
>>> sense for me to test, I can do so.
>> 
>> Does you app make any use of WebKit SPI? If it does, the SPI might not be 
>> thread-safe even if called from the main thread, and so you might be 
>> corrupting the heap.
>> 
>> One technique that might make this bug more reproducible is to set the 
>> environment variable JSC_slowPathAllocsBetweenGCs to a low number (as low as 
>> possible without making your app unusable) — that will trigger collection 
>> more frequently.
>> 
>> Another thing you can try is to record an Instruments time profile of the 
>> app as you go through the steps to make the app crash. That will give us an 
>> overview of what the app was doing leading up to the crash, whether it used 
>> UIWebView from a secondary thread or invoked SPI, and so on.
>> 
>> Geoff
> 

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to