code: def analyze_traceback(tb, inspection_level=None, limit=None):
      
      info = []
      tb_level = tb
      extracted_tb = traceback.extract_tb(tb, limit=limit)
      for ii, (filepath, line, module, code) in enumerate(extracted_tb):
          func_source, func_lineno = inspect.getsourcelines(tb_level.tb_frame)
  
          d = {"File": filepath,
               "Error Line Number": line,
               "Module": module,
               "Error Line": code,
               "Module Line Number": func_lineno,
               "Custom Inspection": {},
               "Source Code": ''}
          if inspection_level is None or len(extracted_tb) - ii <= inspection_level:
              # Perform advanced inspection on the last `inspection_level` tracebacks.
              d['Source Code'] = ''.join(func_source)
              d['Local Variables'] = get_local_references(tb_level)
              d['Object Variables'] = get_object_references(tb_level, d['Source Code'])
          tb_level = getattr(tb_level, 'tb_next', None)
          info.append(d)
  
      return info
docs: Extract trace back information into a list of dictionaries.
  
      :param tb: traceback
      :return: list of dicts containing filepath, line, module, code, traceback level and source code for tracebacks