Böser WebKit-Crash

  • Böser WebKit-Crash

    Hall zusammen,
    ich versuche ähnlich wie hier beschrieben einen Screenshot von einer Website zu machen. Das ganze geschieht in einem eigenen Thread.

    Dabei crasht meine App regelmäßig. So sieht der Backtrace aus:

    Quellcode

    1. #0 0x95d5bfa8 in khtml::RenderBlock::paintFloats ()
    2. #1 0x95d5c2d0 in khtml::RenderBlock::paintObject ()
    3. #2 0x95d5c17c in khtml::RenderBlock::paint ()
    4. #3 0x95d5ab28 in khtml::RenderLayer::paintLayer ()
    5. #4 0x95d5ac20 in khtml::RenderLayer::paintLayer ()
    6. #5 0x95d5a774 in KWQKHTMLPart::paint ()
    7. #6 0x95d5a6ac in -[WebCoreBridge drawRect:withPainter:] ()
    8. #7 0x95d5a43c in -[WebCoreBridge drawRect:] ()
    9. #8 0x95b64240 in -[WebHTMLView drawSingleRect:] ()
    10. #9 0x95b31d70 in -[WebHTMLView drawRect:] ()
    11. #10 0x9374c858 in -[NSView _drawRect:clip:] ()
    12. #11 0x9374b5fc in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] ()
    13. #12 0x95b32dc8 in -[WebHTMLView(WebPrivate) _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] ()
    14. #13 0x9374b9a8 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] ()
    15. #14 0x9374b9a8 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] ()
    16. #15 0x9374b9a8 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] ()
    17. #16 0x9374b9a8 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] ()
    18. #17 0x9374b9a8 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] ()
    19. #18 0x9374b308 in -[NSNextStepFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] ()
    20. #19 0x93745054 in -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] ()
    21. #20 0x9373a348 in -[NSView displayIfNeeded] ()
    22. #21 0x9373a1b8 in -[NSWindow displayIfNeeded] ()
    23. #22 0x9373a064 in _handleWindowNeedsDisplay ()
    24. #23 0x907dc73c in __CFRunLoopDoObservers ()
    25. #24 0x907dc9dc in __CFRunLoopRun ()
    26. #25 0x907dc47c in CFRunLoopRunSpecific ()
    27. #26 0x93203740 in RunCurrentEventLoopInMode ()
    28. #27 0x93202dd4 in ReceiveNextEventCommon ()
    29. #28 0x93202c40 in BlockUntilNextEventMatchingListInMode ()
    30. #29 0x93706ae4 in _DPSNextEvent ()
    31. #30 0x937067a8 in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] ()
    32. #31 0x93702cec in -[NSApplication run] ()
    33. #32 0x937f387c in NSApplicationMain ()
    Alles anzeigen


    Hat da zufällig schonmal jemand Erfahrungen mit gemacht? Hab keine Ahnung,wie ich die Sache angehen soll.

    Grüße
    læng
    "Wales is the land of my fathers. And my fathers can have it." - Dylan Thomas
  • Wenn ich runLoop in Verbindung mit Thread lese bekomme ich Gänsehaut (kay, der "Kotzsmilie").

    Überprüfe mal, ob du ein Objekt zwischen den Threads rumschiebst, das sich in irgendeiner Form als Observer der RL im anderen Thread registriert hat

    [NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]

    untilDate, wäre hier mal ein Favorit für die RL.

    Sowas sorgt für die schönsten Funktionen (suche mal nach runloop in den kressevadder Beiträgen)
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Original von kressevadderÜberprüfe mal, ob du ein Objekt zwischen den Threads rumschiebst, das sich in irgendeiner Form als Observer der RL im anderen Thread registriert hat

    Wüsste ich jetzt nicht. Das ist der einzige Thread, den ich selbst erstelle, aber ich schau nochmal…
    "Wales is the land of my fathers. And my fathers can have it." - Dylan Thomas
  • Habs mal mit

    Quellcode

    1. [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.3]];
    probiert.
    Klappt auch net so richtig, aber immerhin is das ganz erst beim 25. Versuch oder so gecrasht (sag mal, kay, wie wärs eigentlich mit nem Kotz-Smiley? :P)

    Ich probier noch ein wenig rum…
    "Wales is the land of my fathers. And my fathers can have it." - Dylan Thomas
  • RE: Böser WebKit-Crash

    Ich glaube auch, dass Multithreading das Problem ist. Aber nicht die Verbindung Threads - RunLoop (kressevadder, was hast Du dagegen?). Der Dump sieht so aus, als ob nicht Deiner, sondern der Hauptthread kneift, wenn er sich um die Bildschirmdarstellung kümmert. Ich vermute, dass das Rendering des WebKit schlicht nicht Thread-safe ist. Warum willst Du das denn von einem Nebenthread aus machen? Ich habe hier eine Anwendung, die das fröhlich aus dem Hauptthread macht - oft, schnell und zuverlässig.
    Multigrad - 360°-Produktfotografie für den Mac
  • RE: Böser WebKit-Crash

    Original von mattik
    Ich glaube auch, dass Multithreading das Problem ist. Aber nicht die Verbindung Threads - RunLoop (kressevadder, was hast Du dagegen?). Der Dump sieht so aus, als ob nicht Deiner, sondern der Hauptthread kneift, wenn er sich um die Bildschirmdarstellung kümmert. Ich vermute, dass das Rendering des WebKit schlicht nicht Thread-safe ist. Warum willst Du das denn von einem Nebenthread aus machen? Ich habe hier eine Anwendung, die das fröhlich aus dem Hauptthread macht - oft, schnell und zuverlässig.

    Weil es bei mir eben nicht schnell ist. Dauert so zwischen 5 und 15 Sekunden :sick:
    "Wales is the land of my fathers. And my fathers can have it." - Dylan Thomas
  • Original von kressevadder
    Hä, wie?

    Soll das heisen du hast die View an den neuen Thread übergeben oder sowas?

    Nö. Hab nur ne Seite geladen und nen Screenshot gemacht, eigentlich.
    "Wales is the land of my fathers. And my fathers can have it." - Dylan Thomas
  • Generell sind Run-Loop-Events und Threads zwei verschiedene Systeme um das gleiche Problem der scheinbaren Nebenläufigkeit zu lösen. Die Kombination ist also schon etwas schwierig.

    Das Laden von Seiten läuft in der Regel in der RL. Demnachh sollte ees nicht ohne Weiteres im Thread erfolgen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?