Improve get_fiber_manager_map_*() error reporting
authorPeter DeLong <pdelong@fb.com>
Fri, 16 Jun 2017 17:32:35 +0000 (10:32 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Fri, 16 Jun 2017 17:40:14 +0000 (10:40 -0700)
Summary:
get_fiber_manager_map_vevb() and get_fiber_manager_map_evb() don't
provide very useful feedback when called with an empty map (just the former) or
with a program that doesn't have debug symbols (both)

Reviewed By: andriigrynenko

Differential Revision: D5260114

fbshipit-source-id: c44b4e279e5c88dc08507b969339a4befc23d79b

folly/fibers/scripts/gdb.py

index dcb17e2..a9c1e3a 100644 (file)
@@ -277,14 +277,25 @@ class Shortcut(gdb.Function):
 
 
 def get_fiber_manager_map(evb_type):
 
 
 def get_fiber_manager_map(evb_type):
-    global_cache_type = gdb.lookup_type(
-        "folly::fibers::(anonymous namespace)::GlobalCache<" + evb_type + ">")
+    try:
+        # Exception thrown if unable to find type
+        # Probably because of missing debug symbols
+        global_cache_type = gdb.lookup_type(
+            "folly::fibers::(anonymous namespace)::GlobalCache<" + evb_type + ">")
+    except gdb.error:
+        raise gdb.GdbError("Unable to find types. "
+                           "Please make sure debug info is available for this binary.\n"
+                           "Have you run 'fbload debuginfo_fbpkg'?")
+
     global_cache_instance_ptr_ptr = gdb.parse_and_eval(
         "&'" + global_cache_type.name + "::instance()::ret'")
     global_cache_instance_ptr_ptr = gdb.parse_and_eval(
         "&'" + global_cache_type.name + "::instance()::ret'")
-    global_cache_instance = global_cache_instance_ptr_ptr.cast(
-        global_cache_type.pointer().pointer()).dereference().dereference()
-    return global_cache_instance['map_']
+    global_cache_instance_ptr = global_cache_instance_ptr_ptr.cast(
+        global_cache_type.pointer().pointer()).dereference()
+    if global_cache_instance_ptr == 0x0:
+        raise gdb.GdbError("FiberManager map is empty.")
 
 
+    global_cache_instance = global_cache_instance_ptr.dereference()
+    return global_cache_instance['map_']
 
 def get_fiber_manager_map_evb():
     return get_fiber_manager_map("folly::EventBase")
 
 def get_fiber_manager_map_evb():
     return get_fiber_manager_map("folly::EventBase")