save resource zeroing stacks in ScriptElement for debugging
authorgavinp@chromium.org <gavinp@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Oct 2011 16:40:47 +0000 (16:40 +0000)
committergavinp@chromium.org <gavinp@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Oct 2011 16:40:47 +0000 (16:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=69453

The state machine tracking how m_cachedScript gets zeroed shows that sometimes we get
two notifyFinished() events in a ScriptElement, which can crash chrome (see chrome bug
75604).  This patch will save a stack in the ScriptElement when this happens, so that if
we do later crash, we can see how we did the first zeroing.

See http://code.google.com/p/chromium/issues/detail?id=75604 for the chromium bug that
this change will help track down.

Reviewed by Nate Chapin.

No new tests, this shouldn't affect output at all, and isn't particularly testable.

* dom/ScriptElement.cpp:
(WebCore::ScriptElement::ScriptElement):
(WebCore::ScriptElement::stopLoadRequest):
(WebCore::ScriptElement::notifyFinished):
* dom/ScriptElement.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@96819 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/dom/ScriptElement.cpp
Source/WebCore/dom/ScriptElement.h

index b291712..72265f1 100644 (file)
@@ -1,3 +1,26 @@
+2011-10-06  Gavin Peters  <gavinp@chromium.org>
+
+        save resource zeroing stacks in ScriptElement for debugging
+        https://bugs.webkit.org/show_bug.cgi?id=69453
+
+        The state machine tracking how m_cachedScript gets zeroed shows that sometimes we get
+        two notifyFinished() events in a ScriptElement, which can crash chrome (see chrome bug
+        75604).  This patch will save a stack in the ScriptElement when this happens, so that if
+        we do later crash, we can see how we did the first zeroing.
+
+        See http://code.google.com/p/chromium/issues/detail?id=75604 for the chromium bug that
+        this change will help track down.
+
+        Reviewed by Nate Chapin.
+
+        No new tests, this shouldn't affect output at all, and isn't particularly testable.
+
+        * dom/ScriptElement.cpp:
+        (WebCore::ScriptElement::ScriptElement):
+        (WebCore::ScriptElement::stopLoadRequest):
+        (WebCore::ScriptElement::notifyFinished):
+        * dom/ScriptElement.h:
+
 2011-10-06  RĂ©mi Duraffort  <remi.duraffort@st.com>
 
         Fix compilation by adding some missing ENABLE(VIDEO|XSLT)
index f983cc1..f3f80f9 100644 (file)
@@ -66,6 +66,7 @@ ScriptElement::ScriptElement(Element* element, bool parserInserted, bool already
     , m_forceAsync(!parserInserted)
     , m_willExecuteInOrder(false)
     , m_cachedScriptState(NeverSet)
+    , m_backtraceSize(0)
 {
     ASSERT(m_element);
 }
@@ -302,7 +303,10 @@ void ScriptElement::stopLoadRequest()
         if (!m_willBeParserExecuted)
             m_cachedScript->removeClient(this);
         ASSERT(m_cachedScriptState == Set);
+
         m_cachedScriptState = ZeroedInStopLoadRequest;
+        m_backtraceSize = MaxBacktraceSize;
+        WTFGetBacktrace(m_backtrace, &m_backtraceSize);
         m_cachedScript = 0;
     }
 }
@@ -331,6 +335,8 @@ void ScriptElement::notifyFinished(CachedResource* o)
 
     ASSERT(m_cachedScriptState == Set);
     m_cachedScriptState = ZeroedInNotifyFinished;
+    m_backtraceSize = MaxBacktraceSize;
+    WTFGetBacktrace(m_backtrace, &m_backtraceSize);
     m_cachedScript = 0;
 }
 
index 7872600..9bc9f87 100644 (file)
@@ -113,6 +113,14 @@ private:
       ZeroedInStopLoadRequest,
       ZeroedInNotifyFinished,
     } m_cachedScriptState;
+
+    // We grab a backtrace when we zero m_cachedScript, so that at later crashes
+    // we'll have a debuggable stack.
+    enum {
+        MaxBacktraceSize = 32
+    };
+    int m_backtraceSize;
+    void* m_backtrace[MaxBacktraceSize];
 };
 
 ScriptElement* toScriptElement(Element*);