vmmap crash at JavaScriptCore: 0x31cd12f6 (the JavaScript malloc zone enumerator)
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Jul 2015 21:29:07 +0000 (21:29 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Jul 2015 21:29:07 +0000 (21:29 +0000)
https://bugs.webkit.org/show_bug.cgi?id=147274

Reviewed by Anders Carlsson.

It's not really clear why vmmap sometimes fails to read the target
process, but we can avoid a crash when it does. This is useful because
you'll still get all the non-bmalloc data out of the target process,
and bmalloc might not even be relevant to your investigation.

* bmalloc/Zone.cpp:
(bmalloc::remoteRead): Check for failure.

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

Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/Zone.cpp

index 2379c41..44a5ba3 100644 (file)
@@ -1,5 +1,20 @@
 2015-07-24  Geoffrey Garen  <ggaren@apple.com>
 
+        vmmap crash at JavaScriptCore: 0x31cd12f6 (the JavaScript malloc zone enumerator)
+        https://bugs.webkit.org/show_bug.cgi?id=147274
+
+        Reviewed by Anders Carlsson.
+
+        It's not really clear why vmmap sometimes fails to read the target
+        process, but we can avoid a crash when it does. This is useful because
+        you'll still get all the non-bmalloc data out of the target process,
+        and bmalloc might not even be relevant to your investigation.
+
+        * bmalloc/Zone.cpp:
+        (bmalloc::remoteRead): Check for failure.
+
+2015-07-24  Geoffrey Garen  <ggaren@apple.com>
+
         JavaScriptCore bmalloc should not register its malloc zone more than once
         https://bugs.webkit.org/show_bug.cgi?id=147273
 
index 25a6094..72c6aea 100644 (file)
@@ -30,8 +30,16 @@ namespace bmalloc {
 
 template<typename T> static void remoteRead(task_t task, memory_reader_t reader, vm_address_t remotePointer, T& result)
 {
-    void* tmp;
-    (*reader)(task, remotePointer, sizeof(T), &tmp);
+    void* tmp = nullptr;
+    kern_return_t error = reader(task, remotePointer, sizeof(T), &tmp);
+
+    // This read sometimes fails for unknown reasons (<rdar://problem/14093757>).
+    // Avoid a crash by skipping the memcpy when this happens.
+    if (error || !tmp) {
+        fprintf(stderr, "bmalloc: error reading remote process: 0x%x\n", error);
+        return;
+    }
+
     memcpy(&result, tmp, sizeof(T));
 }