From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32288 invoked by alias); 5 Aug 2013 08:17:17 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 32273 invoked by uid 89); 5 Aug 2013 08:17:16 -0000 X-Spam-SWARE-Status: No, score=-2.7 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,KHOP_RCVD_UNTRUST,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,RDNS_NONE autolearn=no version=3.3.1 Received: from Unknown (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Mon, 05 Aug 2013 08:17:13 +0000 Received: from svr-orw-fem-01.mgc.mentorg.com ([147.34.98.93]) by relay1.mentorg.com with esmtp id 1V6FyU-0005vL-4S from Yao_Qi@mentor.com for gdb-patches@sourceware.org; Mon, 05 Aug 2013 01:17:06 -0700 Received: from SVR-ORW-FEM-04.mgc.mentorg.com ([147.34.97.41]) by svr-orw-fem-01.mgc.mentorg.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Mon, 5 Aug 2013 01:17:05 -0700 Received: from qiyao.dyndns.org (147.34.91.1) by svr-orw-fem-04.mgc.mentorg.com (147.34.97.41) with Microsoft SMTP Server id 14.2.247.3; Mon, 5 Aug 2013 01:17:05 -0700 From: Yao Qi To: Subject: [PATCH] Set entryval_error to NULL if entryval is set Date: Mon, 05 Aug 2013 08:17:00 -0000 Message-ID: <1375690566-7417-1-git-send-email-yao@codesourcery.com> MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2013-08/txt/msg00129.txt.bz2 Hi, I get an internal error when 'set print entry-values' to 'both' and then type command 'tfind 0', shown as below, (gdb) target remote :1234 Remote debugging using :1234 (gdb) b main Breakpoint 1 at 0x80483eb: file ../../../../git/gdb/testsuite/gdb.trace/trace-unavailable.c, line 41. (gdb) c Continuing. Breakpoint 1, main () at ../../../../git/gdb/testsuite/gdb.trace/trace-unavailable.c:41 41 bar (4, s); (gdb) trace bar Tracepoint 3 at 0x80483ca: file ../../../../git/gdb/testsuite/gdb.trace/trace-unavailable.c, line 22. (gdb) actions Enter actions for tracepoint 3, one per line. End with a line saying just "end". >collect array >collect j >end (gdb) tstart (gdb) b marker Breakpoint 4 at 0x80483e3: file ../../../../git/gdb/testsuite/gdb.trace/trace-unavailable.c, line 34. (gdb) c Continuing. Breakpoint 4, marker () at ../../../../git/gdb/testsuite/gdb.trace/trace-unavailable.c:34 34 {} (gdb) tstop (gdb) set print entry-values both (gdb) tfind 0 ../../../git/gdb/stack.c:223: internal-error: print_frame_arg: Assertion `!arg->val || !arg->error' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? " In print_frame_arg, this assert indicates that either arg->val or arg->error should be NULL. It looks right to me. This patch is to set 'entryval_error' NULL when 'entryval' is set (non-NULL). The test case is modified to expose this internal error, and without fix in read_frame_arg, we can get the internal error when running gdb.trace/collection.exp (gdb) PASS: gdb.trace/collection.exp: collect args collectively: tfind test frame tfind -1^M No longer looking at any trace frame^M 79 }^M (gdb) set print entry-values only^M (gdb) tfind 0^M Found trace frame 0, tracepoint 4^M A problem internal to GDB has been detected,^M further debugging may prove unreliable.^M Quit this debugging session? (y or n) FAIL: gdb.trace/collection.exp: collect args collectively: tfind 0 with entry-values only (GDB internal error) This internal error is fixed when the patch is applied. The patch is tested on x86_64-linux with board file unix.exp and native-gdbserver.exp respectively. gdb: 2013-08-05 Yao Qi * stack.c (read_frame_arg): Set 'entryval_error' to NULL if 'entryval' is set. gdb/testsuite: 2013-08-05 Yao Qi * gdb.trace/collection.exp (gdb_collect_args_test): Set "only" and "both" to 'print entry-values' before selecting trace frame. --- gdb/stack.c | 5 ++++- gdb/testsuite/gdb.trace/collection.exp | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletions(-) diff --git a/gdb/stack.c b/gdb/stack.c index 3177877..9e9ebc1 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -475,7 +475,10 @@ read_frame_arg (struct symbol *sym, struct frame_info *frame, || print_entry_values == print_entry_values_both || (print_entry_values == print_entry_values_preferred && (!val || value_optimized_out (val)))) - entryval = allocate_optimized_out_value (SYMBOL_TYPE (sym)); + { + entryval = allocate_optimized_out_value (SYMBOL_TYPE (sym)); + entryval_error = NULL; + } } if ((print_entry_values == print_entry_values_compact || print_entry_values == print_entry_values_if_needed diff --git a/gdb/testsuite/gdb.trace/collection.exp b/gdb/testsuite/gdb.trace/collection.exp index f6d44ce..844cbb5 100644 --- a/gdb/testsuite/gdb.trace/collection.exp +++ b/gdb/testsuite/gdb.trace/collection.exp @@ -128,6 +128,22 @@ proc gdb_collect_args_test { myargs msg } { # Begin the test. run_trace_experiment $msg args_test_func + # Frame arguments and their entry values are displaced correctly with + # various values of "print entry-values" when a trace frame is + # selected. + + gdb_test "tfind -1" ".*" "" + gdb_test_no_output "set print entry-values only" "" + gdb_test "tfind 0" \ + " \\(argc@entry=\[^,\]*, argi@entry=\[^,\]*, argf@entry=\[^,\]*, argd@entry=\[^,\]*, argstruct@entry=\[^,\]*, argarray@entry=\[^,\]*\\) .*" \ + "collect $msg: tfind 0 with entry-values only" + + gdb_test "tfind -1" ".*" "" + gdb_test_no_output "set print entry-values both" "" + gdb_test "tfind 0" \ + " \\(argc=\[^,\]*, argc@entry=\[^,\]*, argi=\[^,\]*, argi@entry=\[^,\]*, argf=\[^,\]*, argf@entry=\[^,\]*, argd=\[^,\]*, argd@entry=\[^,\]*, argstruct=\[^,\]*, argstruct@entry=\[^,\]*, argarray=\[^,\]*, argarray@entry=\[^,\]*\\) .*" \ + "collect $msg: tfind 0 with entry-values both" + gdb_test "print argc" \ "\\$\[0-9\]+ = 1 '.001'$cr" \ "collect $msg: collected arg char" -- 1.7.7.6