Fix fibers gdb utils script
[folly.git] / folly / fibers / scripts / utils.gdb
1 # Print given Fiber state
2 # arg0 folly::fibers::Fiber*
3 define print_folly_fiber_state
4   set $fiber = (folly::fibers::Fiber*)$arg0
5   if $fiber->state_ == folly::fibers::Fiber::INVALID
6     printf "Invalid"
7   end
8   if $fiber->state_ == folly::fibers::Fiber::NOT_STARTED
9     printf "Not started"
10   end
11   if $fiber->state_ == folly::fibers::Fiber::READY_TO_RUN
12     printf "Ready to run"
13   end
14   if $fiber->state_ == folly::fibers::Fiber::RUNNING
15     printf "Running"
16   end
17   if $fiber->state_ == folly::fibers::Fiber::AWAITING
18     printf "Awaiting"
19   end
20   if $fiber->state_ == folly::fibers::Fiber::AWAITING_IMMEDIATE
21     printf "Awaiting immediate"
22   end
23   if $fiber->state_ == folly::fibers::Fiber::YIELDED
24     printf "Yielded"
25   end
26 end
27
28 # Print given Fiber
29 # arg0 folly::fibers::Fiber*
30 define print_folly_fiber
31   set $fiber = (folly::fibers::Fiber*)$arg0
32   printf "  (folly::fibers::Fiber*)%p\n\n", $fiber
33
34   printf "  State: "
35   print_folly_fiber_state $fiber
36   printf "\n"
37
38   if $fiber->state_ != folly::fibers::Fiber::INVALID && \
39      $fiber->state_ != folly::fibers::Fiber::NOT_STARTED && \
40      $fiber->state_ != folly::fibers::Fiber::RUNNING
41     printf "  Backtrace:\n"
42     set $frameptr = ((uint64_t*)$fiber->fiberImpl_.fiberContext_)[6]
43     set $k = 0
44     while $frameptr != 0
45       printf "    #%d at %p in ", $k, *((void**)($frameptr+8))
46       set $k = $k + 1
47       info symbol *((void**)($frameptr+8))
48       set $frameptr = *((void**)($frameptr))
49     end
50   end
51 end
52
53 # Print given FiberManager
54 # arg0 folly::fibers::FiberManager*
55 define print_folly_fiber_manager
56   set $fiberManager = (folly::fibers::FiberManager*)$arg0
57
58   printf "  (folly::fibers::FiberManager*)%p\n\n", $fiberManager
59   printf "  Fibers active: %d\n", $fiberManager->fibersActive_
60   printf "  Fibers allocated: %d\n", $fiberManager->fibersAllocated_
61   printf "  Fibers pool size: %d\n", $fiberManager->fibersPoolSize_
62   printf "  Active fiber: (folly::fibers::Fiber*)%p\n", \
63          $fiberManager->activeFiber_
64   printf "  Current fiber: (folly::fibers::Fiber*)%p\n", \
65          $fiberManager->currentFiber_
66
67   set $all_fibers = &($fiberManager->allFibers_.data_.root_plus_size_.m_header)
68   set $fiber_hook = $all_fibers->next_
69   printf "\n  Active fibers:\n"
70   while $fiber_hook != $all_fibers
71     set $fiber = (folly::fibers::Fiber*) \
72         ((int64_t)$fiber_hook - \
73          (int64_t)&folly::fibers::Fiber::globalListHook_)
74     if $fiber->state_ != folly::fibers::Fiber::INVALID
75       printf "    (folly::fibers::Fiber*)%p   State: ", $fiber
76       print_folly_fiber_state $fiber
77       printf "\n"
78     end
79     set $fiber_hook = $fiber_hook->next_
80   end
81 end
82
83 # Print global FiberManager map
84 define print_folly_fiber_manager_map
85   set $global_cache=*(('folly::fibers::(anonymous namespace)::GlobalCache'**) \
86       &'folly::fibers::(anonymous namespace)::GlobalCache::instance()::ret')
87   printf "  Global FiberManager map has %d entries.\n", \
88          $global_cache->map_->_M_h->_M_element_count
89
90   set $item = $global_cache->map_->_M_h->_M_before_begin._M_nxt
91   while $item != 0
92     set $evb = ((folly::EventBase**)$item)[1]
93     set $fiberManager = ((folly::fibers::FiberManager**)$item)[2]
94     printf "    (folly::EventBase*)%p -> (folly::fibers::FiberManager*)%p\n", \
95            $evb, $fiberManager
96
97     set $item = $item->_M_nxt
98   end
99 end