From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2673 invoked by alias); 14 Feb 2012 18:03:20 -0000 Received: (qmail 2649 invoked by uid 22791); 14 Feb 2012 18:03:18 -0000 X-SWARE-Spam-Status: No, hits=-1.4 required=5.0 tests=AWL,BAYES_00,RCVD_NUMERIC_HELO,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from plane.gmane.org (HELO plane.gmane.org) (80.91.229.3) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 14 Feb 2012 18:03:05 +0000 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1RxMiV-0007y5-Ax for gdb-patches@sources.redhat.com; Tue, 14 Feb 2012 19:03:03 +0100 Received: from 209.226.137.107 ([209.226.137.107]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 14 Feb 2012 19:03:03 +0100 Received: from aristovski by 209.226.137.107 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 14 Feb 2012 19:03:03 +0100 To: gdb-patches@sources.redhat.com From: Aleksandar Ristovski Subject: [patch] Assert when 'break' with no arguments Date: Tue, 14 Feb 2012 18:03:00 -0000 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------070101090907080303030202" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20120129 Thunderbird/10.0 X-IsSubscribed: yes 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 X-SW-Source: 2012-02/txt/msg00273.txt.bz2 This is a multi-part message in MIME format. --------------070101090907080303030202 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 1401 Hello, An issue exists where if 'break' command is issued while on a line that underwent inlining by the compiler gdb asserts with Assertion `sal.pspace != NULL' I narrowed down the issue to frame.c:find_frame_sal, combined with stack.c:set_last_displayed_sal and in the view of print_frame_info. The fix proposed here would be to properly initialize 'sal' in find_frmae_sal. Additional check is performed in set_last_displayed_sal to make sure we do not set last_displayed_* vars and validate them if pspace is NULL as, clearly, the rest of the code expects it to be properly set. I identified the same issue in 7.2, 7.3.1, 7.4 and HEAD. I have not checked earlier versions. Test suite did not show regressions, and new test passes where it would fail without the patch. ChangeLog: 2012-02-14 Aleksandar Ristovski * frame.c (find_frame_sal): Initialise sal->pspace field from frame data. * stack.c (set_last_displayed_sal): Perform sanity check of the data passed in, in particular, validate that PSPACE is not NULL if requesting valid last_displayed_* data. Test suite ChangeLOg: 2012-02-14 Aleksandar Ristovski * gdb.base/break-inline.exp: New test. * gdb.base/break-inline.c: New test. Attached are patch for the fix and tests. Thank you, Aleksandar Ristovski QNX Software Systems --------------070101090907080303030202 Content-Type: text/x-patch; name="pspace-assert-201202141250.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="pspace-assert-201202141250.patch" Content-length: 1281 Index: gdb/frame.c =================================================================== RCS file: /cvs/src/src/gdb/frame.c,v retrieving revision 1.304 diff -u -p -r1.304 frame.c --- gdb/frame.c 4 Jan 2012 08:17:02 -0000 1.304 +++ gdb/frame.c 14 Feb 2012 16:35:12 -0000 @@ -2096,6 +2096,9 @@ find_frame_sal (struct frame_info *frame we can't do much better. */ sal->pc = get_frame_pc (frame); + /* Set pspace with frame's pspace */ + sal->pspace = get_frame_program_space (frame); + return; } Index: gdb/stack.c =================================================================== RCS file: /cvs/src/src/gdb/stack.c,v retrieving revision 1.247 diff -u -p -r1.247 stack.c --- gdb/stack.c 7 Feb 2012 04:48:22 -0000 1.247 +++ gdb/stack.c 14 Feb 2012 16:35:12 -0000 @@ -904,11 +904,17 @@ set_last_displayed_sal (int valid, struc CORE_ADDR addr, struct symtab *symtab, int line) { + if (valid && pspace == NULL) { + warning(_("Trying to set NULL pspace.")); + } last_displayed_sal_valid = valid; last_displayed_pspace = pspace; last_displayed_addr = addr; last_displayed_symtab = symtab; last_displayed_line = line; + + if (valid && pspace == NULL) + last_displayed_sal_valid = 0; } /* Forget the last sal we displayed. */ --------------070101090907080303030202 Content-Type: text/plain; name="break-inline.exp" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="break-inline.exp" Content-length: 995 # Copyright 2012 Free # Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # This file was written by Rob Savoye. (rob@cygnus.com) if { [prepare_for_testing break-inline.exp "break-inline" {} {debug nowarnings optimize=-O2}] } { return -1 } gdb_test "start" "Temporary breakpoint.*" gdb_test "next" "foo().*" # Now test 'break' with no arguments. gdb_test "break" ".*" --------------070101090907080303030202 Content-Type: text/x-csrc; name="break-inline.c" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="break-inline.c" Content-length: 908 /* This testcase is part of GDB, the GNU debugger. Copyright 2012 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include static int g; static inline void foo(void) { g = 42; printf("%d\n", g); } int main(int argc, char *argv[]) { foo(); return g; } --------------070101090907080303030202--