diff options
author | Greg Clayton <gclayton@apple.com> | 2012-09-01 00:34:35 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2012-09-01 00:34:35 +0000 |
commit | c373ca5c74ab69b94fa0f48a58a0c16f2e7e16e1 (patch) | |
tree | e405234dc4dba96a85ecafdd71df02e71ba127ad /lldb/examples | |
parent | d35a4ff88bcf2c7c853f52bdf5c60e7772b052af (diff) | |
download | bcm5719-llvm-c373ca5c74ab69b94fa0f48a58a0c16f2e7e16e1.tar.gz bcm5719-llvm-c373ca5c74ab69b94fa0f48a58a0c16f2e7e16e1.zip |
<rdar://problem/12069589>
Fixed an issue where not all text would always be seen when running any of the functions in heap.py in Xcode. Now we put the text directly into the command result object and skip STDIO since we have issues with STDIO right now in python scripts.
Also fixed an issue with the "--stack-history" option where MallocStackLoggingNoCompact was assumed to have to be enabled... It doesn't, just MallocStackLogging.
llvm-svn: 163042
Diffstat (limited to 'lldb/examples')
-rw-r--r-- | lldb/examples/darwin/heap_find/heap.py | 93 | ||||
-rw-r--r-- | lldb/examples/darwin/heap_find/heap/heap_find.cpp | 8 |
2 files changed, 49 insertions, 52 deletions
diff --git a/lldb/examples/darwin/heap_find/heap.py b/lldb/examples/darwin/heap_find/heap.py index ea023f25e9e..3a04846e6d7 100644 --- a/lldb/examples/darwin/heap_find/heap.py +++ b/lldb/examples/darwin/heap_find/heap.py @@ -44,10 +44,9 @@ def load_dylib(): if not os.path.exists(libheap_dylib_path) or os.stat(heap_source_file).st_mtime > os.stat(libheap_dylib_path).st_mtime: # Remake the dylib make_command = '(cd "%s" ; make EXE="%s" ARCH=%s)' % (heap_code_directory, libheap_dylib_path, string.split(triple, '-')[0]) - # print make_command (make_exit_status, make_output) = commands.getstatusoutput(make_command) if make_exit_status != 0: - print make_output + return 'error: make failed: %s' % (make_output) if os.path.exists(libheap_dylib_path): libheap_dylib_spec = lldb.SBFileSpec(libheap_dylib_path) if lldb.target.FindModule(libheap_dylib_spec): @@ -133,7 +132,7 @@ def add_common_options(parser): parser.add_option('-M', '--max-matches', type='int', dest='max_matches', help='the maximum number of matches to print', default=256) parser.add_option('-O', '--offset', type='int', dest='offset', help='the matching data must be at this offset', default=-1) -def dump_stack_history_entry(stack_history_entry, idx): +def dump_stack_history_entry(result, stack_history_entry, idx): address = int(stack_history_entry.address) if address: type_flags = int(stack_history_entry.type_flags) @@ -151,7 +150,7 @@ def dump_stack_history_entry(stack_history_entry, idx): type_str = 'generic' else: type_str = hex(type_flags) - print 'stack[%u]: addr = 0x%x, type=%s, frames:' % (idx, address, type_str) + result.AppendMessage('stack[%u]: addr = 0x%x, type=%s, frames:' % (idx, address, type_str)) frame_idx = 0 idx = 0 pc = int(stack_history_entry.frames[idx]) @@ -160,18 +159,18 @@ def dump_stack_history_entry(stack_history_entry, idx): frames = symbolicator.symbolicate(pc) if frames: for frame in frames: - print ' [%u] %s' % (frame_idx, frame) + result.AppendMessage(' [%u] %s' % (frame_idx, frame)) frame_idx += 1 else: - print ' [%u] 0x%x' % (frame_idx, pc) + result.AppendMessage(' [%u] 0x%x' % (frame_idx, pc)) frame_idx += 1 idx = idx + 1 pc = int(stack_history_entry.frames[idx]) else: pc = 0 - print + result.AppendMessage('') -def dump_stack_history_entries(addr, history): +def dump_stack_history_entries(result, addr, history): # malloc_stack_entry *get_stack_history_for_address (const void * addr) expr = 'get_stack_history_for_address((void *)0x%x, %u)' % (addr, history) expr_sbvalue = lldb.frame.EvaluateExpression (expr) @@ -181,14 +180,16 @@ def dump_stack_history_entries(addr, history): idx = 0; stack_history_entry = expr_value[idx] while int(stack_history_entry.address) != 0: - dump_stack_history_entry(stack_history_entry, idx) + dump_stack_history_entry(result, stack_history_entry, idx) idx = idx + 1 stack_history_entry = expr_value[idx] + else: + result.AppendMessage('"%s" returned zero' % (expr)) else: - print 'error: expression failed "%s" => %s' % (expr, expr_sbvalue.error) + result.AppendMessage('error: expression failed "%s" => %s' % (expr, expr_sbvalue.error)) -def display_match_results (options, arg_str_description, expr_sbvalue, print_no_matches = True): +def display_match_results (result, options, arg_str_description, expr_sbvalue, print_no_matches = True): if expr_sbvalue.error.Success(): if expr_sbvalue.unsigned: match_value = lldb.value(expr_sbvalue) @@ -198,7 +199,7 @@ def display_match_results (options, arg_str_description, expr_sbvalue, print_no_ print_entry = True match_entry = match_value[i]; i += 1 if i >= options.max_matches: - print 'error: the max number of matches (%u) was reached, use the --max-matches option to get more results' % (options.max_matches) + result.AppendMessage('error: the max number of matches (%u) was reached, use the --max-matches option to get more results' % (options.max_matches)) break malloc_addr = match_entry.addr.sbvalue.unsigned if malloc_addr == 0: @@ -249,38 +250,36 @@ def display_match_results (options, arg_str_description, expr_sbvalue, print_no_ if print_entry: match_idx += 1 if description: - print description + result.AppendMessage(description) if options.print_type and derefed_dynamic_value: - print derefed_dynamic_value + result.AppendMessage('%s' % (derefed_dynamic_value)) if options.print_object_description and dynamic_value: desc = dynamic_value.GetObjectDescription() if desc: - print ', po=%s\n' % (desc) + result.AppendMessage(', po=%s' % (desc)) if options.memory: cmd_result = lldb.SBCommandReturnObject() memory_command = "memory read -f %s 0x%x 0x%x" % (options.format, malloc_addr, malloc_addr + malloc_size) lldb.debugger.GetCommandInterpreter().HandleCommand(memory_command, cmd_result) - print cmd_result.GetOutput() + result.AppendMessage(cmd_result.GetOutput()) if options.stack_history: - dump_stack_history_entries(malloc_addr, 1) + dump_stack_history_entries(result, malloc_addr, 1) elif options.stack: - dump_stack_history_entries(malloc_addr, 0) + dump_stack_history_entries(result, malloc_addr, 0) return i elif print_no_matches: - print 'no matches found for %s' % (arg_str_description) + result.AppendMessage('no matches found for %s' % (arg_str_description)) else: - print expr_sbvalue.error + result.AppendMessage(expr_sbvalue.error ) return 0 -def heap_search(options, arg_str): +def heap_search(result, options, arg_str): dylid_load_err = load_dylib() if dylid_load_err: - print dylid_load_err + result.AppendMessage(dylid_load_err) return expr = None arg_str_description = arg_str - if options.format == None: - options.format = "Y" # 'Y' is "bytes with ASCII" format if options.type == 'pointer': expr = 'find_pointer_in_heap((void *)%s)' % (arg_str) arg_str_description = 'malloc block containing pointer %s' % arg_str @@ -299,10 +298,12 @@ def heap_search(options, arg_str): expr = 'find_block_for_address((void *)%s)' % arg_str arg_str_description = 'malloc block for %s' % arg_str else: - print 'error: invalid type "%s"\nvalid values are "pointer", "cstr"' % options.type + result.AppendMessage('error: invalid type "%s"\nvalid values are "pointer", "cstr"' % options.type) return + if options.format == None: + options.format = "Y" # 'Y' is "bytes with ASCII" format - display_match_results (options, arg_str_description, lldb.frame.EvaluateExpression (expr)) + display_match_results (result, options, arg_str_description, lldb.frame.EvaluateExpression (expr)) def ptr_refs(debugger, command, result, dict): command_args = shlex.split(command) @@ -324,9 +325,9 @@ def ptr_refs(debugger, command, result, dict): if args: for data in args: - heap_search (options, data) + heap_search (result, options, data) else: - print 'error: no pointer arguments were given' + resultresult.AppendMessage('error: no pointer arguments were given') def cstr_refs(debugger, command, result, dict): command_args = shlex.split(command) @@ -348,9 +349,9 @@ def cstr_refs(debugger, command, result, dict): if args: for data in args: - heap_search (options, data) + heap_search (result, options, data) else: - print 'error: no c string arguments were given to search for' + result.AppendMessage('error: no c string arguments were given to search for'); def malloc_info(debugger, command, result, dict): command_args = shlex.split(command) @@ -369,21 +370,21 @@ def malloc_info(debugger, command, result, dict): options.type = 'addr' if args: for data in args: - heap_search (options, data) + heap_search (result, options, data) else: - print 'error: no c string arguments were given to search for' + result.AppendMessage('error: no c string arguments were given to search for') def malloc_history(debugger, command, result, dict): command_args = shlex.split(command) usage = "usage: %prog [options] <EXPR> [EXPR ...]" description='''Gets the allocation history for an expression whose result is an address. - Programs should set the MallocStackLoggingNoCompact=1 in the environment to enable stack history. This can be done - with "process launch -v MallocStackLoggingNoCompact=1 -- [arg1 ...]"''' + Programs should set the MallocStackLogging=1 in the environment to enable stack history. This can be done + with "process launch -v MallocStackLogging=1 -- [arg1 ...]"''' dylid_load_err = load_dylib() if dylid_load_err: - print dylid_load_err + result.AppendMessage(dylid_load_err) else: if command_args: for addr_expr_str in command_args: @@ -393,9 +394,9 @@ def malloc_history(debugger, command, result, dict): if addr != 0: dump_stack_history_entries (addr, 1) else: - print 'error: expression error for "%s": %s' % (addr_expr_str, expr_sbvalue.error) + result.AppendMessage('error: expression error for "%s": %s' % (addr_expr_str, expr_sbvalue.error)) else: - print 'error: no address expressions were specified' + result.AppendMessage('error: no address expressions were specified') def section_ptr_refs(debugger, command, result, dict): command_args = shlex.split(command) @@ -414,7 +415,7 @@ def section_ptr_refs(debugger, command, result, dict): sections = list() section_modules = list() if not options.section_names: - print 'error: at least one section must be specified with the --section option' + result.AppendMessage('error: at least one section must be specified with the --section option') return for module in lldb.target.modules: @@ -426,13 +427,13 @@ def section_ptr_refs(debugger, command, result, dict): if sections: dylid_load_err = load_dylib() if dylid_load_err: - print dylid_load_err + result.AppendMessage(dylid_load_err) return for expr_str in args: for (idx, section) in enumerate(sections): expr = 'find_pointer_in_memory(0x%xllu, %ullu, (void *)%s)' % (section.addr.load_addr, section.size, expr_str) arg_str_description = 'section %s.%s containing "%s"' % (section_modules[idx].file.fullpath, section.name, expr_str) - num_matches = display_match_results (options, arg_str_description, lldb.frame.EvaluateExpression (expr), False) + num_matches = display_match_results (result, options, arg_str_description, lldb.frame.EvaluateExpression (expr), False) if num_matches: if num_matches < options.max_matches: options.max_matches = options.max_matches - num_matches @@ -441,7 +442,7 @@ def section_ptr_refs(debugger, command, result, dict): if options.max_matches == 0: return else: - print 'error: no sections were found that match any of %s' % (', '.join(options.section_names)) + result.AppendMessage('error: no sections were found that match any of %s' % (', '.join(options.section_names))) def objc_refs(debugger, command, result, dict): command_args = shlex.split(command) @@ -456,7 +457,7 @@ def objc_refs(debugger, command, result, dict): dylid_load_err = load_dylib() if dylid_load_err: - print dylid_load_err + result.AppendMessage(dylid_load_err) else: if args: for class_name in args: @@ -466,13 +467,13 @@ def objc_refs(debugger, command, result, dict): isa = expr_sbvalue.unsigned if isa: options.type = 'isa' - heap_search (options, '0x%x' % isa) + heap_search (result, options, '0x%x' % isa) else: - print 'error: Can\'t find isa for an ObjC class named "%s"' % (class_name) + result.AppendMessage('error: Can\'t find isa for an ObjC class named "%s"' % (class_name)) else: - print 'error: expression error for "%s": %s' % (addr_expr_str, expr_sbvalue.error) + result.AppendMessage('error: expression error for "%s": %s' % (addr_expr_str, expr_sbvalue.error)) else: - print 'error: no address expressions were specified' + result.AppendMessage('error: no address expressions were specified') if __name__ == '__main__': lldb.debugger = lldb.SBDebugger.Create() diff --git a/lldb/examples/darwin/heap_find/heap/heap_find.cpp b/lldb/examples/darwin/heap_find/heap/heap_find.cpp index 38f5491e6c6..78ad1b3096f 100644 --- a/lldb/examples/darwin/heap_find/heap/heap_find.cpp +++ b/lldb/examples/darwin/heap_find/heap/heap_find.cpp @@ -132,7 +132,6 @@ __mach_stack_logging_frames_for_uniqued_stack ( //---------------------------------------------------------------------- extern "C" int stack_logging_enable_logging; -extern "C" int stack_logging_dontcompact; //---------------------------------------------------------------------- // Local defines @@ -345,12 +344,9 @@ get_stack_history_for_address (const void * addr, int history) { std::vector<malloc_stack_entry> empty; g_malloc_stack_history.swap(empty); - if (!stack_logging_enable_logging || (history && !stack_logging_dontcompact)) + if (!stack_logging_enable_logging) { - if (history) - strncpy(g_error_string, "error: stack history logging is not enabled, set MallocStackLoggingNoCompact=1 in the environment when launching to enable stack history logging.", sizeof(g_error_string)); - else - strncpy(g_error_string, "error: stack logging is not enabled, set MallocStackLogging=1 in the environment when launching to enable stack logging.", sizeof(g_error_string)); + strncpy(g_error_string, "error: stack logging is not enabled, set MallocStackLogging=1 in the environment when launching to enable stack logging.", sizeof(g_error_string)); return NULL; } kern_return_t err; |