From: Andrii Grynenko Date: Thu, 19 Jan 2017 01:09:38 +0000 (-0800) Subject: Add fiber-print-limit command X-Git-Tag: v2017.03.06.00~95 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7feeb55d86025996bc75091222a24519845aeca4;p=folly.git Add fiber-print-limit command Summary: Limits number of fibers printed for each FiberManager. Reviewed By: yfeldblum Differential Revision: D4432488 fbshipit-source-id: 1791c2bfe6d5b0c2f54142dc068b473fd72f5d5d --- diff --git a/folly/fibers/README.md b/folly/fibers/README.md index c9947d3d..d1ab0eed 100644 --- a/folly/fibers/README.md +++ b/folly/fibers/README.md @@ -497,6 +497,11 @@ $4 = } } +

fiber-print-limit command can be used to change the maximum number of fibers printed for a fibers::FiberManager (default value is 100).

+ +
(gdb) fiber-print-limit 10
+New fiber limit for FiberManager printer set to 10
+

Printing a fiber-task #

Given a pointer to a fibers::Fiber, which is running some fiber-task, you can get its current state:

diff --git a/folly/fibers/scripts/gdb.py b/folly/fibers/scripts/gdb.py index 1f5e9f95..a9587022 100644 --- a/folly/fibers/scripts/gdb.py +++ b/folly/fibers/scripts/gdb.py @@ -58,6 +58,8 @@ class FiberPrinter: class FiberManagerPrinter: """Print a folly::fibers::Fiber""" + fiber_print_limit = 100 + def __init__(self, fm): self.fm = fm @@ -68,7 +70,13 @@ class FiberManagerPrinter: active_fibers = collections.OrderedDict() + fiber_count = 0 + while fiber_hook != all_fibers.address: + if fiber_count == FiberManagerPrinter.fiber_print_limit: + active_fibers["..."] = "..." + break + fiber = fiber_hook.cast(gdb.lookup_type("int64_t")) fiber = fiber - gdb.parse_and_eval( "(int64_t)&folly::fibers::Fiber::globalListHook_") @@ -80,6 +88,8 @@ class FiberManagerPrinter: fiber_hook = fiber_hook.dereference()['next_'] + fiber_count = fiber_count + 1 + return active_fibers.items() def to_string(self): @@ -89,6 +99,20 @@ class FiberManagerPrinter: return "folly::fibers::FiberManager" +class FiberPrintLimitCommand(gdb.Command): + def __init__(self): + super(FiberPrintLimitCommand, self).__init__( + "fiber-print-limit", gdb.COMMAND_USER) + + def invoke(self, arg, from_tty): + if not arg: + print("New limit has to be passed to 'fiber_print_limit' command") + return + FiberManagerPrinter.fiber_print_limit = int(arg) + print("New fiber limit for FiberManager printer set to " + + str(FiberManagerPrinter.fiber_print_limit)) + + class FrameId(object): def __init__(self, sp, pc): self.sp = sp @@ -281,6 +305,7 @@ def build_pretty_printer(): def load(): gdb.printing.register_pretty_printer(gdb, build_pretty_printer()) gdb.xmethod.register_xmethod_matcher(gdb, FiberXMethodMatcher()) + FiberPrintLimitCommand() FiberActivateCommand() FiberDeactivateCommand() Shortcut("get_fiber_manager_map_evb", get_fiber_manager_map_evb)