diff options
author | Enrico Granata <egranata@apple.com> | 2012-03-29 19:29:45 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2012-03-29 19:29:45 +0000 |
commit | d50f18b1a04dbf18019e6d5dae62c1852b3c9b7b (patch) | |
tree | bc48213d1281a69296b8fec11676096eae54a381 /lldb/examples/summaries/cocoa/NSData.py | |
parent | 751aac610a7c6213e7f5720944f94df0b973af38 (diff) | |
download | bcm5719-llvm-d50f18b1a04dbf18019e6d5dae62c1852b3c9b7b.tar.gz bcm5719-llvm-d50f18b1a04dbf18019e6d5dae62c1852b3c9b7b.zip |
Part 1 of a series of fixes meant to improve reliability and increase ease of bug fixing for data formatter issues.
We are introducing a new Logger class on the Python side. This has the same purpose, but is unrelated, to the C++ logging facility
The Pythonic logging can be enabled by using the following scripting commands:
(lldb) script Logger._lldb_formatters_debug_level = {0,1,2,...}
0 = no logging
1 = do log
2 = flush after logging each line - slower but safer
3 or more = each time a Logger is constructed, log the function that has created it
more log levels may be added, each one being more log-active than the previous
by default, the log output will come out on your screen, to direct it to a file:
(lldb) script Logger._lldb_formatters_debug_filename = 'filename'
that will make the output go to the file - set to None to disable the file output and get screen logging back
Logging has been enabled for the C++ STL formatters and for Cocoa class NSData - more logging will follow
synthetic children providers for classes list and map (both libstdcpp and libcxx) now have internal capping for safety reasons
this will fix crashers where a malformed list or map would not ever meet our termination conditions
to set the cap to a different value:
(lldb) script {gnu_libstdcpp|libcxx}.{map|list}_capping_size = new_cap (by default, it is 255)
you can optionally disable the loop detection algorithm for lists
(lldb) script {gnu_libstdcpp|libcxx}.list_uses_loop_detector = False
llvm-svn: 153676
Diffstat (limited to 'lldb/examples/summaries/cocoa/NSData.py')
-rw-r--r-- | lldb/examples/summaries/cocoa/NSData.py | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/lldb/examples/summaries/cocoa/NSData.py b/lldb/examples/summaries/cocoa/NSData.py index 94da6057f5c..36f213393a5 100644 --- a/lldb/examples/summaries/cocoa/NSData.py +++ b/lldb/examples/summaries/cocoa/NSData.py @@ -10,6 +10,7 @@ import lldb import ctypes import objc_runtime import metrics +import Logger statistics = metrics.Metrics() statistics.add_metric('invalid_isa') @@ -25,6 +26,8 @@ class NSConcreteData_SummaryProvider: pass def __init__(self, valobj, params): + logger = Logger.Logger() + logger >> "NSConcreteData_SummaryProvider __init__" self.valobj = valobj; self.sys_params = params if not(self.sys_params.types_cache.NSUInteger): @@ -46,9 +49,13 @@ class NSConcreteData_SummaryProvider: return 2 * self.sys_params.pointer_size def length(self): + logger = Logger.Logger() + logger >> "NSConcreteData_SummaryProvider length" size = self.valobj.CreateChildAtOffset("count", self.offset(), self.sys_params.types_cache.NSUInteger) + logger >> str(size) + logger >> str(size.GetValueAsUnsigned(0)) return size.GetValueAsUnsigned(0) @@ -57,6 +64,8 @@ class NSDataUnknown_SummaryProvider: pass def __init__(self, valobj, params): + logger = Logger.Logger() + logger >> "NSDataUnknown_SummaryProvider __init__" self.valobj = valobj; self.sys_params = params self.update(); @@ -65,21 +74,31 @@ class NSDataUnknown_SummaryProvider: self.adjust_for_architecture(); def length(self): + logger = Logger.Logger() + logger >> "NSDataUnknown_SummaryProvider length" stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) + logger >> stream.GetData() num_children_vo = self.valobj.CreateValueFromExpression("count","(int)[" + stream.GetData() + " length]"); + logger >> "still in after expression: " + str(num_children_vo) if num_children_vo.IsValid(): + logger >> "wow - expr output is valid: " + str(num_children_vo.GetValueAsUnsigned()) return num_children_vo.GetValueAsUnsigned(0) + logger >> "invalid expr output - too bad" return '<variable is not NSData>' def GetSummary_Impl(valobj): global statistics + logger = Logger.Logger() + logger >> "NSData GetSummary_Impl" class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) if wrapper: + logger >> "got a wrapper summary - using it" return wrapper name_string = class_data.class_name() + logger >> "class name: " + name_string if name_string == 'NSConcreteData' or \ name_string == 'NSConcreteMutableData' or \ name_string == '__NSCFData': @@ -91,12 +110,16 @@ def GetSummary_Impl(valobj): return wrapper; def NSData_SummaryProvider (valobj,dict): + logger = Logger.Logger() + logger >> "NSData_SummaryProvider" provider = GetSummary_Impl(valobj); + logger >> "found a summary provider, it is: " + str(provider) if provider != None: try: summary = provider.length(); except: summary = None + logger >> "got a summary: it is " + str(summary) if summary == None: summary = '<variable is not NSData>' elif isinstance(summary,basestring): @@ -110,7 +133,10 @@ def NSData_SummaryProvider (valobj,dict): return 'Summary Unavailable' def NSData_SummaryProvider2 (valobj,dict): + logger = Logger.Logger() + logger >> "NSData_SummaryProvider2" provider = GetSummary_Impl(valobj); + logger >> "found a summary provider, it is: " + str(provider) if provider != None: if isinstance(provider,objc_runtime.SpecialSituation_Description): return provider.message() @@ -118,6 +144,7 @@ def NSData_SummaryProvider2 (valobj,dict): summary = provider.length(); except: summary = None + logger >> "got a summary: it is " + str(summary) if summary == None: summary = '<variable is not CFData>' elif isinstance(summary,basestring): |