From: Aleksandar Ristovski <aristovski@qnx.com>
To: gdb-patches@sources.redhat.com
Subject: [patch] Assert when 'break' with no arguments
Date: Tue, 14 Feb 2012 18:03:00 -0000 [thread overview]
Message-ID: <jhe7kc$d91$1@dough.gmane.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 1401 bytes --]
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 <aristovski@qnx.com>
* 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 <aristovski@qnx.com>
* 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
[-- Attachment #2: pspace-assert-201202141250.patch --]
[-- Type: text/x-patch, Size: 1281 bytes --]
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. */
[-- Attachment #3: break-inline.exp --]
[-- Type: text/plain, Size: 995 bytes --]
# 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 <http://www.gnu.org/licenses/>.
# 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" ".*"
[-- Attachment #4: break-inline.c --]
[-- Type: text/x-csrc, Size: 908 bytes --]
/* 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 <http://www.gnu.org/licenses/>. */
#include <stdio.h>
static int g;
static inline void foo(void)
{
g = 42;
printf("%d\n", g);
}
int main(int argc, char *argv[])
{
foo();
return g;
}
next reply other threads:[~2012-02-14 18:03 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-14 18:03 Aleksandar Ristovski [this message]
2012-02-14 18:53 ` Aleksandar Ristovski
2012-02-14 18:06 ` Aleksandar Ristovski
2012-02-14 19:23 ` Joel Brobecker
2012-02-14 20:09 ` Aleksandar Ristovski
2012-02-14 20:18 ` Alfred M. Szmidt
2012-02-14 22:37 ` Aleksandar Ristovski
2012-02-15 17:15 ` Tom Tromey
2012-02-15 20:06 ` Aleksandar Ristovski
2012-02-19 16:42 ` [commit] testsuite: Fix break-inline.exp with gdbserver Jan Kratochvil
2012-02-24 15:52 ` [patch] Assert when 'break' with no arguments Pedro Alves
2012-02-24 16:00 ` Aleksandar Ristovski
2012-02-24 16:09 ` Pedro Alves
2012-02-24 16:18 ` Aleksandar Ristovski
2012-02-24 17:16 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='jhe7kc$d91$1@dough.gmane.org' \
--to=aristovski@qnx.com \
--cc=gdb-patches@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox