From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16236 invoked by alias); 9 Aug 2012 16:59:47 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 16203 invoked by uid 9514); 9 Aug 2012 16:59:45 -0000 Date: Thu, 09 Aug 2012 16:59:00 -0000 Message-ID: <20120809165945.16194.qmail@sourceware.org> From: pmuldoon@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] archer-pmuldoon-python-backtrace: Add -stack-list-locals, add a lot of MI test cases. Fix several locals bugs. X-Git-Refname: refs/heads/archer-pmuldoon-python-backtrace X-Git-Reftype: branch X-Git-Oldrev: a3fd891ea77a71d9c15e93cefa46ef828e3463a2 X-Git-Newrev: 3f14f035eced37f12bd9c065ea8f86ccf26f4150 X-SW-Source: 2012-q3/txt/msg00026.txt.bz2 List-Id: The branch, archer-pmuldoon-python-backtrace has been updated via 3f14f035eced37f12bd9c065ea8f86ccf26f4150 (commit) from a3fd891ea77a71d9c15e93cefa46ef828e3463a2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 3f14f035eced37f12bd9c065ea8f86ccf26f4150 Author: Phil Muldoon Date: Thu Aug 9 17:58:51 2012 +0100 Add -stack-list-locals, add a lot of MI test cases. Fix several locals bugs. ----------------------------------------------------------------------- Summary of changes: gdb/mi/mi-cmd-stack.c | 41 ++++++- gdb/python/lib/gdb/BaseFrameWrapper.py | 33 ++++- gdb/python/py-framefilter.c | 152 ++++++++++++++++-------- gdb/testsuite/gdb.python/py-framefilter-mi.exp | 29 ++++- gdb/testsuite/gdb.python/py-framefilter.c | 2 + gdb/testsuite/gdb.python/py-framefilter.exp | 20 ++- 6 files changed, 212 insertions(+), 65 deletions(-) First 500 lines of diff: diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c index c6f429f..92ab4c2 100644 --- a/gdb/mi/mi-cmd-stack.c +++ b/gdb/mi/mi-cmd-stack.c @@ -199,13 +199,48 @@ void mi_cmd_stack_list_locals (char *command, char **argv, int argc) { struct frame_info *frame; + int raw_arg = 0; + int result = 0; - if (argc != 1) - error (_("-stack-list-locals: Usage: PRINT_VALUES")); + if (argc == 2) + { + int j; + /* Find 'raw-frames' at argv[1] if passed as an argument */ + for (j = 0; j < strlen (argv[1]); j++) + argv[1][j] = tolower (argv[1][j]); + + if (subset_compare (argv[1], "raw-frames")) + raw_arg = 1; + } + + if (argc < 1 || argc > 2 || (argc == 2 && ! raw_arg) + || (argc == 1 && raw_arg)) + error (_("-stack-list-locals: Usage: PRINT_VALUES [RAW-FRAMES]")); frame = get_selected_frame (NULL); - list_args_or_locals (locals, parse_print_values (argv[0]), frame); + if (! raw_arg && frame_filters) + { + int count = 1; + int arg = atoi (argv[0]); + + result = apply_frame_filter (frame,/* frame */ + 1, /* print_level */ + LOC_AND_ADDRESS, /* print_what */ + 0, /* print_frame_info */ + 0, /* print_args */ + arg, /* mi_print_args_type */ + 0, /* cli_print_args_type */ + current_uiout, /* out */ + 1, /* print_locals */ + count /* count */); + } + + if (! frame_filters || raw_arg || result == PY_BT_ERROR + || result == PY_BT_NO_FILTERS) + { + list_args_or_locals (locals, parse_print_values (argv[0]), frame); + } } /* Print a list of the arguments for the current frame. With argument diff --git a/gdb/python/lib/gdb/BaseFrameWrapper.py b/gdb/python/lib/gdb/BaseFrameWrapper.py index c41e1f0..e4ca58d 100644 --- a/gdb/python/lib/gdb/BaseFrameWrapper.py +++ b/gdb/python/lib/gdb/BaseFrameWrapper.py @@ -106,6 +106,25 @@ class FrameVars (): def __init__(self,frame): self.frame = frame + def fetch_b (self, sym): + + # We may have a string as a symbol, in the case of synthetic + # locals/args + if isinstance(sym, basestring): + return True + + sym_type = sym.addr_class + + return { + gdb.SYMBOL_LOC_STATIC: True, + gdb.SYMBOL_LOC_REGISTER: True, + gdb.SYMBOL_LOC_ARG: True, + gdb.SYMBOL_LOC_REF_ARG: True, + gdb.SYMBOL_LOC_LOCAL: True, + gdb.SYMBOL_LOC_REGPARM_ADDR: True, + gdb.SYMBOL_LOC_COMPUTED: True + }.get(sym_type, False) + def fetch_frame_locals (self): lvars = [] block = self.frame.block() @@ -113,8 +132,8 @@ class FrameVars (): for sym in block: if sym.is_argument: continue; - - lvars.append(BaseSymValueWrapper(sym, self.get_value(sym,block))) + if self.fetch_b (sym): + lvars.append(BaseSymValueWrapper(sym, self.get_value(sym,block))) if len(lvars) == 0: return None @@ -128,8 +147,8 @@ class FrameVars (): for sym in block: if not sym.is_argument: continue; - - args.append(BaseSymValueWrapper(sym,self.get_value (sym,block))) + if self.fetch_b (sym): + args.append(BaseSymValueWrapper(sym,self.get_value (sym,block))) if len(args) == 0: return None @@ -139,9 +158,9 @@ class FrameVars (): def get_value (self, sym, block): if len (sym.linkage_name): nsym, is_field_of_this = gdb.lookup_symbol (sym.linkage_name, block) - - if nsym.addr_class != gdb.SYMBOL_LOC_REGISTER: - sym = nsym + if nsym != None: + if nsym.addr_class != gdb.SYMBOL_LOC_REGISTER: + sym = nsym try: val = sym.value (self.frame) diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index 05db015..14217f3 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -116,11 +116,46 @@ extract_sym_and_value (PyObject *obj, char **name, } static int +py_print_type (struct ui_out *out, + struct value *val) +{ + volatile struct gdb_exception except; + + TRY_CATCH (except, RETURN_MASK_ALL) + { + struct type *type; + struct ui_file *stb; + struct cleanup *cleanup; + + stb = mem_fileopen (); + cleanup = make_cleanup_ui_file_delete (stb); + type = check_typedef (value_type (val)); + type_print (type, "", stb, -1); + ui_out_field_stream (out, "type", stb); + do_cleanups (cleanup); + } + if (except.reason > 0) + { + PyErr_SetString (PyExc_RuntimeError, + except.message); + return 0; + } + + return 1; +} + +static int py_print_locals (PyObject *filter, - struct value_print_options opts) + struct ui_out *out, + struct value_print_options opts, + int mi_print_type, + int indent) { - int indent = 4; - struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); + /* In traditional bt full backtraces this is num_tabs (4) * 2 = 8. It + never appears to deviate from this. */ + struct cleanup *old_chain = make_cleanup_ui_out_list_begin_end (out, + "locals"); + if (PyObject_HasAttrString (filter, "frame_locals")) { @@ -156,40 +191,70 @@ py_print_locals (PyObject *filter, struct value *val; int value_success = 0; volatile struct gdb_exception except; - - if (! item) - goto locals_error; + struct cleanup *inner_cleanup = + make_cleanup (null_cleanup, NULL); value_success = extract_sym_and_value (item, &sym_name, &val, &language); + Py_DECREF (item); - item = NULL; if (! value_success) goto locals_error; - fprintf_filtered (gdb_stdout, "%s%s = ", - n_spaces (2 * indent), - sym_name); + if (ui_out_is_mi_like_p (out)) + { + if (mi_print_type != PRINT_NO_VALUES) + { + inner_cleanup = + make_cleanup_ui_out_tuple_begin_end (out, + NULL); + } + } + else + ui_out_spaces (out, (8 + (indent * 2))); + ui_out_field_string (out, "name", sym_name); xfree (sym_name); - TRY_CATCH (except, RETURN_MASK_ERROR) + if (! ui_out_is_mi_like_p (out)) + ui_out_text (out, " = "); + + if (ui_out_is_mi_like_p (out) + && mi_print_type == PRINT_SIMPLE_VALUES) { - opts.deref_ref = 1; - common_val_print (val, gdb_stdout, - indent, &opts, - language); + if (! py_print_type (out, val)) + goto locals_error; } - if (except.reason < 0) + + if (! ui_out_is_mi_like_p (out) + || (ui_out_is_mi_like_p (out) + && mi_print_type != PRINT_NO_VALUES)) { - PyErr_SetString (PyExc_RuntimeError, - except.message); - goto locals_error; + struct ui_file *stb; + stb = mem_fileopen (); + make_cleanup_ui_file_delete (stb); + + TRY_CATCH (except, RETURN_MASK_ALL) + { + get_user_print_options (&opts); + opts.deref_ref = 1; + common_val_print (val, stb, 2, &opts, language); + } + if (except.reason > 0) + { + PyErr_SetString (PyExc_RuntimeError, + except.message); + goto locals_error; + } + + ui_out_field_stream (out, "value", stb); } - fprintf_filtered (gdb_stdout, "\n"); - gdb_flush (gdb_stdout); + + ui_out_text (out, "\n"); + do_cleanups (inner_cleanup); + } if (! item && PyErr_Occurred()) @@ -197,9 +262,10 @@ py_print_locals (PyObject *filter, } } } + else + goto locals_error; } - else - goto locals_error; + do_cleanups (old_chain); return 1; @@ -213,7 +279,7 @@ static int py_print_args (PyObject *filter, struct ui_out *out, struct value_print_options opts, - int print_type, + int mi_print_type, const char *print_args_type) { struct cleanup *old_chain; @@ -285,7 +351,7 @@ py_print_args (PyObject *filter, if (ui_out_is_mi_like_p (out)) { - if(print_type != PRINT_NO_VALUES) + if(mi_print_type != PRINT_NO_VALUES) { inner_cleanup = make_cleanup_ui_out_tuple_begin_end (out, @@ -303,23 +369,9 @@ py_print_args (PyObject *filter, opts.deref_ref = 1; if (ui_out_is_mi_like_p (out) - && print_type == PRINT_SIMPLE_VALUES) + && mi_print_type == PRINT_SIMPLE_VALUES) { - TRY_CATCH (except, RETURN_MASK_ALL) - { - struct type *type; - stb = mem_fileopen (); - make_cleanup_ui_file_delete (stb); - type = check_typedef (value_type (val)); - type_print (type, "", stb, -1); - ui_out_field_stream (out, "type", stb); - } - if (except.reason > 0) - { - PyErr_SetString (PyExc_RuntimeError, - except.message); - goto args_error; - } + py_print_type (out, val); } if (! ui_out_is_mi_like_p (out)) @@ -327,8 +379,9 @@ py_print_args (PyObject *filter, opts.summary = !strcmp (print_args_type, "scalars"); } - if (ui_out_is_mi_like_p (out) - && print_type != PRINT_NO_VALUES) + if (! ui_out_is_mi_like_p (out) + || (ui_out_is_mi_like_p (out) + && mi_print_type != PRINT_NO_VALUES)) { stb = mem_fileopen (); make_cleanup_ui_file_delete (stb); @@ -420,7 +473,10 @@ py_print_frame (PyObject *filter, struct frame_info *frame = NULL; struct cleanup *cleanup_stack = make_cleanup (null_cleanup, NULL); - cleanup_stack = make_cleanup_ui_out_tuple_begin_end (out, "frame"); + /* -stack-list-locals and -stack-list-arguments do not require a + wrapping frame attribute. */ + if (print_frame_info || print_args) + make_cleanup_ui_out_tuple_begin_end (out, "frame"); /* Get the underlying frame. */ if (PyObject_HasAttrString (filter, "inferior_frame")) @@ -473,7 +529,7 @@ py_print_frame (PyObject *filter, } /* Print frame level. */ - if (print_level) + if ((print_frame_info || print_args) && print_level) { struct frame_info **slot; int level; @@ -620,7 +676,9 @@ py_print_frame (PyObject *filter, if (print_locals) { - int success = py_print_locals (filter, opts); + int success = py_print_locals (filter, out, opts, + mi_print_args_type, indent); + if (success == 0 && PyErr_Occurred ()) goto error; } @@ -669,7 +727,7 @@ py_print_frame (PyObject *filter, if (success == 0 && PyErr_Occurred ()) { Py_DECREF (item); - do_cleanups (cleanup_stack); + //do_cleanups (cleanup_stack); goto error; } diff --git a/gdb/testsuite/gdb.python/py-framefilter-mi.exp b/gdb/testsuite/gdb.python/py-framefilter-mi.exp index a4210e4..e946396 100644 --- a/gdb/testsuite/gdb.python/py-framefilter-mi.exp +++ b/gdb/testsuite/gdb.python/py-framefilter-mi.exp @@ -104,10 +104,35 @@ mi_gdb_test "-stack-list-arguments 2 22 27" \ mi_gdb_test "-stack-list-arguments 2 raw-frames" \ "\\^done,stack-args=\\\[frame={level=\"0\",args=\\\[\\\]},frame={level=\"1\",args=\\\[\\\]},frame={level=\"2\",args=\\\[{name=\"j\",type=\"int\",value=\"10\"}\\\]},.*frame={level=\"22\",args=\\\[\\\]},frame={level=\"23\",args=\\\[\\\]},.*frame={level=\"26\",args=\\\[{name=\"f\",type=\"int\",value=\"3\"},{name=\"d\",type=\"int\",value=\"5\"}\\\]},frame={level=\"27\",args=\\\[\\\]}\\\]" \ - "stack-list-arguments 2" + "stack-list-arguments 2 raw-frames" mi_gdb_test "-stack-list-arguments 2 raw-frames 22 27" \ "\\^done,stack-args=\\\[frame={level=\"22\",args=\\\[\\\]},frame={level=\"23\",args=\\\[\\\]},.*frame={level=\"26\",args=\\\[{name=\"f\",type=\"int\",value=\"3\"},{name=\"d\",type=\"int\",value=\"5\"}\\\]},frame={level=\"27\",args=\\\[\\\]}\\\]" \ - "stack-list-arguments 2 22 27" + "stack-list-arguments 2 raw-frames 22 27" + +#stack-list-locals +mi_gdb_test "-stack-list-locals 0 raw-frames" \ + "\\^done,locals=\\\[name=\"str\",name=\"st2\",name=\"b\",name=\"c\"\\\]" \ + "stack-list-locals 0 raw-frames" + +mi_gdb_test "-stack-list-locals 1 raw-frames" \ + "\\^done,locals=\\\[{name=\"str\",value=\"$hex \\\\\"The End\\\\\"\"},{name=\"st2\",value=\"$hex \\\\\"Is Near\\\\\"\"},{name=\"b\",value=\"12\"},{name=\"c\",value=\"5\"}\\\]" \ + "stack-list-locals 1 raw-frames" + +mi_gdb_test "-stack-list-locals 2 raw-frames" \ + "\\^done,locals=\\\[{name=\"str\",type=\"const char \\\*\",value=\"$hex \\\\\"The End\\\\\"\"},{name=\"st2\",type=\"const char \\\*\",value=\"$hex \\\\\"Is Near\\\\\"\"},{name=\"b\",type=\"int\",value=\"12\"},{name=\"c\",type=\"short int\",value=\"5\"}\\\]" \ + "stack-list-locals 2 raw-frames" + +mi_gdb_test "-stack-list-locals 0" \ + "\\^done,locals=\\\[name=\"str\",name=\"st2\",name=\"b\",name=\"c\"\\\]" \ + "stack-list-locals 0" + +mi_gdb_test "-stack-list-locals 1" \ + "\\^done,locals=\\\[{name=\"str\",value=\"$hex \\\\\"The End\\\\\"\"},{name=\"st2\",value=\"$hex \\\\\"Is Near\\\\\"\"},{name=\"b\",value=\"12\"},{name=\"c\",value=\"5\"}\\\]" \ + "stack-list-locals 1" + +mi_gdb_test "-stack-list-locals 2" \ + "\\^done,locals=\\\[{name=\"str\",type=\"const char \\\*\",value=\"$hex \\\\\"The End\\\\\"\"},{name=\"st2\",type=\"const char \\\*\",value=\"$hex \\\\\"Is Near\\\\\"\"},{name=\"b\",type=\"int\",value=\"12\"},{name=\"c\",type=\"short int\",value=\"5\"}\\\]" \ + "stack-list-locals 2" remote_file host delete ${remote_python_file} diff --git a/gdb/testsuite/gdb.python/py-framefilter.c b/gdb/testsuite/gdb.python/py-framefilter.c index 931ae42..3e7f145 100644 --- a/gdb/testsuite/gdb.python/py-framefilter.c +++ b/gdb/testsuite/gdb.python/py-framefilter.c @@ -67,6 +67,8 @@ void func1(void) int func2(void) { + int foo = 42; + func1(); return 1; } diff --git a/gdb/testsuite/gdb.python/py-framefilter.exp b/gdb/testsuite/gdb.python/py-framefilter.exp index 44db502..e08c349 100644 --- a/gdb/testsuite/gdb.python/py-framefilter.exp +++ b/gdb/testsuite/gdb.python/py-framefilter.exp @@ -17,6 +17,7 @@ # frame-filters. load_lib gdb-python.exp +global hex set testfile "py-framefilter" set srcfile ${testfile}.c @@ -61,24 +62,31 @@ gdb_breakpoint [gdb_get_line_number "Backtrace end breakpoint"] gdb_continue_to_breakpoint "Backtrace end breakpoint" gdb_test "info frame-filter" \ - {.*1000.*Yes.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*} + ".*1000.*Yes.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*" # Test raw gdb_test "bt raw" \ - {.*#0.*end_func.*#22.*in func1.*#27.*in main ().*} + ".*#0.*end_func.*#22.*in func1.*#27.*in main ().*" # Test reverse gdb_test "bt" \ - {.*#0.*cnuf_dne.*#22.*in 1cnuf.*#27.*in niam ().*} + ".*#0.*cnuf_dne.*#22.*in 1cnuf.*#27.*in niam ().*" # Disable Reverse gdb_test_no_output "set python frame-filter disable global Reverse" gdb_test "bt" \ - {.*#0.*end_func.*#22.*in func1.*#27.*in main ().*} + ".*#0.*end_func.*#22.*in func1.*#27.*in main ().*" gdb_test "bt -2" \ - {.*#26.*func5.*#27.*in main ().*} + ".*#26.*func5.*#27.*in main ().*" gdb_test "bt 3" \ - {.*#0.*end_func.*#1.*in funca ().*#2.*in funcb ().*} + ".*#0.*end_func.*#1.*in funca ().*#2.*in funcb ().*" + +gdb_test "bt raw full" \ + ".*#0.*end_func.*str = $hex \"The End\".*st2 = $hex \"Is Near\".*b = 12.*c = 5.*#1.*in funca ().*#2.*in funcb \\(j=10\\).*bar = \{a = 42, b = 84\}.*" + +gdb_test "bt full" \ + ".*#0.*end_func.*str = $hex \"The End\".*st2 = $hex \"Is Near\".*b = 12.*c = 5.*#1.*in funca ().*#2.*in funcb \\(j=10\\).*bar = \{a = 42, b = 84\}.*#22.*in func1 \\(\\).*#23.*in func2 \\(\\).*foo = 42.*" + remote_file host delete ${remote_python_file} hooks/post-receive -- Repository for Project Archer.