Skip to content

Commit c29c24b

Browse files
committed
[crashlog] Pass the debugger around instead of relying on lldb.debugger
The lldb.debugger et al convenience variables are only available from the interactive script interpreter. In all other scenarios, they are None (since fc1fd6b) before that they were default initialized. The crashlog script was hacking around that by setting the lldb.debugger to a newly created debugger instance when running outside of the script interpreter, which works fine until lldb creates a script interpreter instance under the hood and clears the variables. This was resulting in an AttributeError when invoking the script directly (from outside of lldb): AttributeError: 'NoneType' object has no attribute 'GetSourceManager' This patch fixes that by passing around the debugger instance. rdar://64775776 Differential revision: https://reviews.llvm.org/D90706
1 parent b45ea44 commit c29c24b

File tree

2 files changed

+26
-24
lines changed

2 files changed

+26
-24
lines changed

lldb/examples/python/crashlog.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def dump_symbolicated(self, crash_log, options):
131131
if line_entry.IsValid():
132132
strm = lldb.SBStream()
133133
if line_entry:
134-
lldb.debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers(
134+
crash_log.debugger.GetSourceManager().DisplaySourceLinesWithLineNumbers(
135135
line_entry.file, line_entry.line, source_context, source_context, "->", strm)
136136
source_text = strm.GetData()
137137
if source_text:
@@ -310,9 +310,9 @@ def locate_module_and_debug_symbols(self):
310310
self.unavailable = True
311311
return False
312312

313-
def __init__(self, path, verbose):
313+
def __init__(self, debugger, path, verbose):
314314
"""CrashLog constructor that take a path to a darwin crash log file"""
315-
symbolication.Symbolicator.__init__(self)
315+
symbolication.Symbolicator.__init__(self, debugger)
316316
self.path = os.path.expanduser(path)
317317
self.info_lines = list()
318318
self.system_profile = list()
@@ -360,12 +360,12 @@ def create_target(self):
360360
for ident in self.idents:
361361
image = self.find_image_with_identifier(ident)
362362
if image:
363-
self.target = image.create_target()
363+
self.target = image.create_target(self.debugger)
364364
if self.target:
365365
return self.target # success
366366
print('crashlog.create_target()...3')
367367
for image in self.images:
368-
self.target = image.create_target()
368+
self.target = image.create_target(self.debugger)
369369
if self.target:
370370
return self.target # success
371371
print('crashlog.create_target()...4')
@@ -411,12 +411,12 @@ class CrashLogParser:
411411
)
412412

413413

414-
def __init__(self, path, verbose):
414+
def __init__(self, debugger, path, verbose):
415415
self.path = os.path.expanduser(path)
416416
self.verbose = verbose
417417
self.thread = None
418418
self.app_specific_backtrace = False
419-
self.crashlog = CrashLog(self.path, self.verbose)
419+
self.crashlog = CrashLog(debugger, self.path, self.verbose)
420420
self.parse_mode = CrashLogParseMode.NORMAL
421421
self.parsers = {
422422
CrashLogParseMode.NORMAL : self.parse_normal,
@@ -711,7 +711,7 @@ def do_image(self, line):
711711
return False
712712

713713

714-
def interactive_crashlogs(options, args):
714+
def interactive_crashlogs(debugger, options, args):
715715
crash_log_files = list()
716716
for arg in args:
717717
for resolved_path in glob.glob(arg):
@@ -720,7 +720,7 @@ def interactive_crashlogs(options, args):
720720
crash_logs = list()
721721
for crash_log_file in crash_log_files:
722722
try:
723-
crash_log = CrashLogParser(crash_log_file, options.verbose).parse()
723+
crash_log = CrashLogParser(debugger, crash_log_file, options.verbose).parse()
724724
except Exception as e:
725725
print(e)
726726
continue
@@ -848,7 +848,7 @@ def save_crashlog(debugger, command, exe_ctx, result, dict):
848848

849849
def Symbolicate(debugger, command, result, dict):
850850
try:
851-
SymbolicateCrashLogs(shlex.split(command))
851+
SymbolicateCrashLogs(debugger, shlex.split(command))
852852
except Exception as e:
853853
result.PutCString("error: python exception: %s" % e)
854854

@@ -1024,7 +1024,7 @@ def CreateSymbolicateCrashLogOptions(
10241024
return option_parser
10251025

10261026

1027-
def SymbolicateCrashLogs(command_args):
1027+
def SymbolicateCrashLogs(debugger, command_args):
10281028
description = '''Symbolicate one or more darwin crash log files to provide source file and line information,
10291029
inlined stack frames back to the concrete functions, and disassemble the location of the crash
10301030
for the first frame of the crashed thread.
@@ -1052,17 +1052,17 @@ def SymbolicateCrashLogs(command_args):
10521052

10531053
if args:
10541054
if options.interactive:
1055-
interactive_crashlogs(options, args)
1055+
interactive_crashlogs(debugger, options, args)
10561056
else:
10571057
for crash_log_file in args:
1058-
crash_log_parser = CrashLogParser(crash_log_file, options.verbose)
1058+
crash_log_parser = CrashLogParser(debugger, crash_log_file, options.verbose)
10591059
crash_log = crash_log_parser.parse()
10601060
SymbolicateCrashLog(crash_log, options)
10611061
if __name__ == '__main__':
10621062
# Create a new debugger instance
1063-
lldb.debugger = lldb.SBDebugger.Create()
1064-
SymbolicateCrashLogs(sys.argv[1:])
1065-
lldb.SBDebugger.Destroy(lldb.debugger)
1063+
debugger = lldb.SBDebugger.Create()
1064+
SymbolicateCrashLogs(debugger, sys.argv[1:])
1065+
lldb.SBDebugger.Destroy(debugger)
10661066
elif getattr(lldb, 'debugger', None):
10671067
lldb.debugger.HandleCommand(
10681068
'command script add -f lldb.macosx.crashlog.Symbolicate crashlog')

lldb/examples/python/symbolication.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ def get_normalized_uuid_string(self):
410410
return str(self.uuid).upper()
411411
return None
412412

413-
def create_target(self):
413+
def create_target(self, debugger):
414414
'''Create a target using the information in this Image object.'''
415415
if self.unavailable:
416416
return None
@@ -419,7 +419,7 @@ def create_target(self):
419419
resolved_path = self.get_resolved_path()
420420
path_spec = lldb.SBFileSpec(resolved_path)
421421
error = lldb.SBError()
422-
target = lldb.debugger.CreateTarget(
422+
target = debugger.CreateTarget(
423423
resolved_path, self.arch, None, False, error)
424424
if target:
425425
self.module = target.FindModule(path_spec)
@@ -437,8 +437,9 @@ def create_target(self):
437437

438438
class Symbolicator:
439439

440-
def __init__(self):
440+
def __init__(self, debugger):
441441
"""A class the represents the information needed to symbolicate addresses in a program"""
442+
self.debugger = debugger
442443
self.target = None
443444
self.images = list() # a list of images to be used when symbolicating
444445
self.addr_mask = 0xffffffffffffffff
@@ -496,7 +497,7 @@ def create_target(self):
496497

497498
if self.images:
498499
for image in self.images:
499-
self.target = image.create_target()
500+
self.target = image.create_target(self.debugger)
500501
if self.target:
501502
if self.target.GetAddressByteSize() == 4:
502503
triple = self.target.triple
@@ -632,7 +633,7 @@ def print_module_symbols(module):
632633
print(sym)
633634

634635

635-
def Symbolicate(command_args):
636+
def Symbolicate(debugger, command_args):
636637

637638
usage = "usage: %prog [options] <addr1> [addr2 ...]"
638639
description = '''Symbolicate one or more addresses using LLDB's python scripting API..'''
@@ -686,7 +687,7 @@ def Symbolicate(command_args):
686687
(options, args) = parser.parse_args(command_args)
687688
except:
688689
return
689-
symbolicator = Symbolicator()
690+
symbolicator = Symbolicator(debugger)
690691
images = list()
691692
if options.file:
692693
image = Image(options.file)
@@ -720,5 +721,6 @@ def Symbolicate(command_args):
720721

721722
if __name__ == '__main__':
722723
# Create a new debugger instance
723-
lldb.debugger = lldb.SBDebugger.Create()
724-
Symbolicate(sys.argv[1:])
724+
debugger = lldb.SBDebugger.Create()
725+
Symbolicate(debugger, sys.argv[1:])
726+
SBDebugger.Destroy(debugger)

0 commit comments

Comments
 (0)