17e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granatafrom __future__ import print_function 27e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataimport sys 37e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataimport os.path 47e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataimport inspect 57e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 67e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataclass NopLogger: 77e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def __init__(self): 87e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 97e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 107e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def write(self,data): 117e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 127e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 137e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def flush(self): 147e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 157e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 167e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def close(self): 177e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 187e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 197e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 207e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataclass StdoutLogger: 217e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def __init__(self): 227e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 237e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 247e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def write(self,data): 257e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata print(data) 267e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 277e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def flush(self): 287e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 297e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 307e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def close(self): 317e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 327e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 337e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataclass FileLogger: 347e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def __init__(self, name): 357e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.file = None 367e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata try: 377e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata name = os.path.abspath(name) 387e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.file = open(name,'a') 397e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata except: 407e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata try: 417e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.file = open('formatters.log','a') 427e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata except: 437e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 447e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 457e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def write(self,data): 467e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata if self.file != None: 477e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata print(data,file=self.file) 487e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata else: 497e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata print(data) 507e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 517e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def flush(self): 527e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata if self.file != None: 537e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.file.flush() 547e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 557e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def close(self): 567e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata if self.file != None: 577e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.file.close() 587e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.file = None 597e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 607e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata# to enable logging: 6117ab954036c40c0eddf28a45f20db4dfaf0d06efEnrico Granata# define lldb.formatters.Logger._lldb_formatters_debug_level to any number greater than 0 627e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata# if you define it to any value greater than 1, the log will be automatically flushed after each write (slower but should make sure most of the stuff makes it to the log even if we crash) 637e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata# if you define it to any value greater than 2, the calling function's details will automatically be logged (even slower, but provides additional details) 6417ab954036c40c0eddf28a45f20db4dfaf0d06efEnrico Granata# if you need the log to go to a file instead of on screen, define lldb.formatters.Logger._lldb_formatters_debug_filename to a valid filename 657e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granataclass Logger: 667e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def __init__(self,autoflush=False,logcaller=False): 677e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata global _lldb_formatters_debug_level 687e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata global _lldb_formatters_debug_filename 697e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.autoflush = autoflush 707e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata want_log = False 717e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata try: 727e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata want_log = (_lldb_formatters_debug_level > 0) 737e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata except: 747e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 757e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata if not (want_log): 767e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.impl = NopLogger() 777e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata return 787e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata want_file = False 797e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata try: 807e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata want_file = (_lldb_formatters_debug_filename != None and _lldb_formatters_debug_filename != '' and _lldb_formatters_debug_filename != 0) 817e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata except: 827e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 837e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata if want_file: 847e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.impl = FileLogger(_lldb_formatters_debug_filename) 857e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata else: 867e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.impl = StdoutLogger() 877e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata try: 887e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.autoflush = (_lldb_formatters_debug_level > 1) 897e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata except: 907e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.autoflush = autoflush 917e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata want_caller_info = False 927e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata try: 937e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata want_caller_info = (_lldb_formatters_debug_level > 2) 947e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata except: 957e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata pass 967e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata if want_caller_info: 977e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self._log_caller() 987e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 997e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def _log_caller(self): 1007e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata caller = inspect.stack()[2] 1017e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata try: 1027e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata if caller != None and len(caller) > 3: 1037e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.write('Logging from function ' + str(caller)) 1047e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata else: 1057e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.write('Caller info not available - Required caller logging not possible') 1067e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata finally: 1077e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata del caller # needed per Python docs to avoid keeping objects alive longer than we care 1087e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 1097e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def write(self,data): 1107e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.impl.write(data) 1117e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata if self.autoflush: 1127e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.flush() 1137e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 1147e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def __rshift__(self,data): 1157e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.write(data) 1167e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 1177e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def flush(self): 1187e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.impl.flush() 1197e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 1207e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata def close(self): 1217e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata self.impl.close() 1227e202269d09cebf2f5047bf92fff8c8ecf732448Enrico Granata 123