code: def trace_dispatch(self, frame, event, arg):
          
          fun = getattr(self, 'handle_' + event, None)
          if not fun:
              return self.trace_dispatch
          below, continue_below = self.check_below(frame)
          if (self.state.stops(frame, event)
                  or (event == 'line' and self.breaks(frame))
                  or (event == 'exception' and (self.full or below))):
              fun(frame, arg)
  
          if event == 'return' and frame == self.state.frame:
              # Upping state
              if self.state.up():
                  # No more frames
                  self.stop_trace()
                  return
              # Threading / Multiprocessing support
              co = self.state.frame.f_code
              if ((co.co_filename.endswith('threading.py')
                   and co.co_name.endswith('_bootstrap_inner'))
                      or (self.state.frame.f_code.co_filename.endswith(
                          os.path.join('multiprocessing', 'process.py'))
                          and self.state.frame.f_code.co_name == '_bootstrap')):
                  # Thread / Process is dead
                  self.stop_trace()
                  self.die()
                  return
  
          if (event == 'call' and not self.stepping and not self.full
                  and not continue_below
                  and not self.get_file_breaks(frame.f_code.co_filename)):
              # Don't trace anymore here
              return
          return self.trace_dispatch
docs: This function is called every line,
          function call, function return and exception during trace