Rebase to FSF GDB 7.8.1.

This commit is contained in:
Jan Kratochvil 2014-10-30 22:21:18 +01:00
parent 8095c33951
commit 43b0bce1db
11 changed files with 58 additions and 3361 deletions

2
.gitignore vendored
View File

@ -1,2 +1,2 @@
/gdb-libstdc++-v3-python-r155978.tar.bz2
/gdb-7.8.tar.gz
/gdb-7.8.1.tar.xz

View File

@ -1,350 +0,0 @@
http://sourceware.org/ml/gdb-patches/2014-09/msg00102.html
Subject: Re: Regression: GDB stopped on run with attached process (PR 17347) [Re: [pushed+7.8] Re: [PATCH] Fix "attach" command vs user input race
On 09/03/2014 08:58 AM, Jan Kratochvil wrote:
> https://sourceware.org/bugzilla/show_bug.cgi?id=17347
Thanks Jan.
Here's a fix, test included. Comments?
Thanks,
Pedro Alves
--------------------------
[PATCH] gdb/17347 - Regression: GDB stopped on run with attached process
Doing:
gdb --pid=PID -ex run
Results in GDB getting a SIGTTIN, and thus ending stopped. That's
usually indicative of a missing target_terminal_ours call.
E.g., from the PR:
$ sleep 1h & p=$!; sleep 0.1; gdb -batch sleep $p -ex run
[1] 28263
[1] Killed sleep 1h
[2]+ Stopped gdb -batch sleep $p -ex run
The workaround is doing:
gdb -ex "attach $PID" -ex "run"
instead of
gdb [-p] $PID -ex "run"
With the former, gdb waits for the attach command to complete before
moving on to the "run" command, because the interpreter is in sync
mode at this point, within execute_command. But for the latter,
attach_command is called directly from captured_main, and thus misses
that waiting. IOW, "run" is running before the attach continuation
has run, before the program stops and attach completes. The broken
terminal settings are just one symptom of that. Any command that
queries or requires input results in the same.
The fix is to wait in catch_command_errors (which is specific to
main.c nowadays), just like we wait in execute_command.
gdb/ChangeLog:
2014-09-03 Pedro Alves <palves@redhat.com>
PR gdb/17347
* main.c: Include "infrun.h".
(catch_command_errors, catch_command_errors_const): Wait for the
foreground command to complete.
* top.c (maybe_wait_sync_command_done): New function, factored out
from ...
(maybe_wait_sync_command_done): ... here.
* top.h (maybe_wait_sync_command_done): New declaration.
gdb/testsuite/ChangeLog:
2014-09-03 Pedro Alves <palves@redhat.com>
PR gdb/17347
* gdb.base/attach.exp (spawn_test_prog): New, factored out from
...
(do_attach_tests, do_call_attach_tests, do_command_attach_tests):
... here.
(gdb_spawn_with_cmdline_opts): New procedure.
(test_command_line_attach_run): New procedure.
(top level): Call it.
---
gdb/main.c | 9 +++
gdb/testsuite/gdb.base/attach.exp | 118 ++++++++++++++++++++++++++------------
gdb/top.c | 26 +++++----
gdb/top.h | 8 +++
4 files changed, 114 insertions(+), 47 deletions(-)
Index: gdb-7.8/gdb/main.c
===================================================================
--- gdb-7.8.orig/gdb/main.c 2014-09-07 19:12:45.066981588 +0200
+++ gdb-7.8/gdb/main.c 2014-09-07 19:14:22.613095201 +0200
@@ -47,6 +47,7 @@
#include "filenames.h"
#include "filestuff.h"
#include "event-top.h"
+#include "infrun.h"
/* The selected interpreter. This will be used as a set command
variable, so it should always be malloc'ed - since
@@ -350,7 +351,11 @@ catch_command_errors (catch_command_erro
TRY_CATCH (e, mask)
{
+ int was_sync = sync_execution;
+
command (arg, from_tty);
+
+ maybe_wait_sync_command_done (was_sync);
}
return handle_command_errors (e);
}
@@ -369,7 +374,11 @@ catch_command_errors_const (catch_comman
TRY_CATCH (e, mask)
{
+ int was_sync = sync_execution;
+
command (arg, from_tty);
+
+ maybe_wait_sync_command_done (was_sync);
}
return handle_command_errors (e);
}
Index: gdb-7.8/gdb/testsuite/gdb.base/attach.exp
===================================================================
--- gdb-7.8.orig/gdb/testsuite/gdb.base/attach.exp 2014-09-07 19:12:45.067981589 +0200
+++ gdb-7.8/gdb/testsuite/gdb.base/attach.exp 2014-09-07 19:12:48.601985706 +0200
@@ -58,6 +58,37 @@ if [get_compiler_info] {
return -1
}
+# Start the program running and then wait for a bit, to be sure that
+# it can be attached to. Return the process's PID.
+
+proc spawn_test_prog { executable } {
+ set testpid [eval exec $executable &]
+ exec sleep 2
+ if { [istarget "*-*-cygwin*"] } {
+ # testpid is the Cygwin PID, GDB uses the Windows PID, which might be
+ # different due to the way fork/exec works.
+ set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
+ }
+
+ return $testpid
+}
+
+# Spawn GDB with CMDLINE_FLAGS appended to the GDBFLAGS global.
+
+proc gdb_spawn_with_cmdline_opts { cmdline_flags } {
+ global GDBFLAGS
+
+ set saved_gdbflags $GDBFLAGS
+
+ append GDBFLAGS $cmdline_flags
+
+ set res [gdb_spawn]
+
+ set GDBFLAGS $saved_gdbflags
+
+ return $res
+}
+
proc do_attach_tests {} {
global gdb_prompt
global binfile
@@ -70,13 +101,7 @@ proc do_attach_tests {} {
# Start the program running and then wait for a bit, to be sure
# that it can be attached to.
- set testpid [eval exec $binfile &]
- exec sleep 2
- if { [istarget "*-*-cygwin*"] } {
- # testpid is the Cygwin PID, GDB uses the Windows PID, which might be
- # different due to the way fork/exec works.
- set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
- }
+ set testpid [spawn_test_prog $binfile]
# Verify that we cannot attach to nonsense.
@@ -279,16 +304,7 @@ proc do_attach_tests {} {
remote_exec build "kill -9 ${testpid}"
- # Start the program running and then wait for a bit, to be sure
- # that it can be attached to.
-
- set testpid [eval exec $binfile &]
- exec sleep 2
- if { [istarget "*-*-cygwin*"] } {
- # testpid is the Cygwin PID, GDB uses the Windows PID, which might be
- # different due to the way fork/exec works.
- set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
- }
+ set testpid [spawn_test_prog $binfile]
# Verify that we can attach to the process, and find its a.out
# when we're cd'd to some directory that doesn't contain the
@@ -335,16 +351,7 @@ proc do_call_attach_tests {} {
global gdb_prompt
global binfile2
- # Start the program running and then wait for a bit, to be sure
- # that it can be attached to.
-
- set testpid [eval exec $binfile2 &]
- exec sleep 2
- if { [istarget "*-*-cygwin*"] } {
- # testpid is the Cygwin PID, GDB uses the Windows PID, which might be
- # different due to the way fork/exec works.
- set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
- }
+ set testpid [spawn_test_prog $binfile2]
# Attach
@@ -397,16 +404,7 @@ proc do_command_attach_tests {} {
return 0
}
- # Start the program running and then wait for a bit, to be sure
- # that it can be attached to.
-
- set testpid [eval exec $binfile &]
- exec sleep 2
- if { [istarget "*-*-cygwin*"] } {
- # testpid is the Cygwin PID, GDB uses the Windows PID, which might be
- # different due to the way fork/exec works.
- set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
- }
+ set testpid [spawn_test_prog $binfile]
gdb_exit
if $verbose>1 then {
@@ -429,6 +427,50 @@ proc do_command_attach_tests {} {
remote_exec build "kill -9 ${testpid}"
}
+# Test ' gdb --pid PID -ex "run" '. GDB used to have a bug where
+# "run" would run before the attach finished - PR17347.
+
+proc test_command_line_attach_run {} {
+ global gdb_prompt
+ global binfile
+ global verbose
+ global GDB
+ global INTERNAL_GDBFLAGS
+
+ if ![isnative] then {
+ unsupported "commandline attach run test"
+ return 0
+ }
+
+ with_test_prefix "cmdline attach run" {
+ set testpid [spawn_test_prog $binfile]
+
+ set test "run to prompt"
+ gdb_exit
+ set res [gdb_spawn_with_cmdline_opts "--pid=$testpid -ex \"start\""]
+ if { $res != 0} {
+ fail $test
+ return $res
+ }
+ gdb_test_multiple "" $test {
+ -re {Attaching to.*Start it from the beginning\? \(y or n\) } {
+ pass $test
+ }
+ }
+
+ send_gdb "y\n"
+
+ set test "run to main"
+ gdb_test_multiple "" $test {
+ -re "Temporary breakpoint .* main .*$gdb_prompt $" {
+ pass $test
+ }
+ }
+
+ # Get rid of the process
+ remote_exec build "kill -9 ${testpid}"
+ }
+}
# Start with a fresh gdb
@@ -453,4 +495,6 @@ do_call_attach_tests
do_command_attach_tests
+test_command_line_attach_run
+
return 0
Index: gdb-7.8/gdb/top.c
===================================================================
--- gdb-7.8.orig/gdb/top.c 2014-09-07 19:12:45.067981589 +0200
+++ gdb-7.8/gdb/top.c 2014-09-07 19:12:48.601985706 +0200
@@ -375,6 +375,21 @@ check_frame_language_change (void)
}
}
+void
+maybe_wait_sync_command_done (int was_sync)
+{
+ /* If the interpreter is in sync mode (we're running a user
+ command's list, running command hooks or similars), and we
+ just ran a synchronous command that started the target, wait
+ for that command to end. */
+ if (!interpreter_async && !was_sync && sync_execution)
+ {
+ while (gdb_do_one_event () >= 0)
+ if (!sync_execution)
+ break;
+ }
+}
+
/* Execute the line P as a command, in the current user context.
Pass FROM_TTY as second argument to the defining function. */
@@ -461,16 +476,7 @@ execute_command (char *p, int from_tty)
else
cmd_func (c, arg, from_tty);
- /* If the interpreter is in sync mode (we're running a user
- command's list, running command hooks or similars), and we
- just ran a synchronous command that started the target, wait
- for that command to end. */
- if (!interpreter_async && !was_sync && sync_execution)
- {
- while (gdb_do_one_event () >= 0)
- if (!sync_execution)
- break;
- }
+ maybe_wait_sync_command_done (was_sync);
/* If this command has been post-hooked, run the hook last. */
execute_cmd_post_hook (c);
Index: gdb-7.8/gdb/top.h
===================================================================
--- gdb-7.8.orig/gdb/top.h 2014-09-07 19:12:45.068981590 +0200
+++ gdb-7.8/gdb/top.h 2014-09-07 19:12:48.601985706 +0200
@@ -42,6 +42,14 @@ extern void quit_command (char *, int);
extern void quit_cover (void);
extern void execute_command (char *, int);
+/* If the interpreter is in sync mode (we're running a user command's
+ list, running command hooks or similars), and we just ran a
+ synchronous command that started the target, wait for that command
+ to end. WAS_SYNC indicates whether sync_execution was set before
+ the command was run. */
+
+extern void maybe_wait_sync_command_done (int was_sync);
+
extern void check_frame_language_change (void);
/* Prepare for execution of a command.

View File

@ -1,217 +0,0 @@
http://sourceware.org/ml/gdb-patches/2014-09/msg00174.html
Subject: Re: Regression: GDB stopped on run with attached process (PR 17347) [Re: [pushed+7.8] Re: [PATCH] Fix "attach" command vs user input race
--a8Wt8u1KmwUX3Y2C
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
On Wed, 03 Sep 2014 22:11:03 +0200, Pedro Alves wrote:
> On 09/03/2014 08:58 AM, Jan Kratochvil wrote:
>
> > https://sourceware.org/bugzilla/show_bug.cgi?id=17347
>
> Thanks Jan.
>
> Here's a fix, test included. Comments?
In the testsuite run from the Fedora rpm packaging I get:
GNU gdb (GDB) Fedora 7.8-21.fc21^M
Copyright (C) 2014 Free Software Foundation, Inc.^M
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>^M
This is free software: you are free to change and redistribute it.^M
There is NO WARRANTY, to the extent permitted by law. Type "show copying"^M
and "show warranty" for details.^M
This GDB was configured as "i686-redhat-linux-gnu".^M
Type "show configuration" for configuration details.^M
For bug reporting instructions, please see:^M
<http://www.gnu.org/software/gdb/bugs/>.^M
Find the GDB manual and other documentation resources online at:^M
<http://www.gnu.org/software/gdb/documentation/>.^M
For help, type "help".^M
Type "apropos word" to search for commands related to "word".^M
Attaching to process 27028^M
Reading symbols from /unsafebuild-i686-redhat-linux-gnu/gdb/testsuite.unix.-m32/outputs/gdb.base/attach/attach...done.^M
Reading symbols from /lib/libm.so.6...Reading symbols from /usr/lib/debug/usr/lib/libm-2.19.90.so.debug...done.^M
done.^M
Loaded symbols for /lib/libm.so.6^M
Reading symbols from /lib/libc.so.6...Reading symbols from /usr/lib/debug/usr/lib/libc-2.19.90.so.debug...done.^M
done.^M
Loaded symbols for /lib/libc.so.6^M
Reading symbols from /lib/ld-linux.so.2...Reading symbols from /usr/lib/debug/usr/lib/ld-2.19.90.so.debug...done.^M
done.^M
Loaded symbols for /lib/ld-linux.so.2^M
main ()^M
at gdb/testsuite/gdb.base/attach.c:15^M
15 while (! should_exit)^M
The program being debugged has been started already.^M
Start it from the beginning? (y or n) PASS: gdb.base/attach.exp: cmdline attach run: run to prompt
y^M
^M
Temporary breakpoint 1 at 0x8048481: file gdb/testsuite/gdb.base/attach.c, line 13.^M
Starting program: /unsafe/home/jkratoch/hammock/20140907fedorarel21-f21/fedora-2---Type <return> to continue, or q <return> to quit---ERROR: Window too small.
UNRESOLVED: gdb.base/attach.exp: cmdline attach run: run to main
While I do not fully understand why that happens in every run of that Fedora
testsuite while it never happens during my reproducibility attempts by hand
I find it understandable and the Fedora testsuite issues does get fixed by the
attached patch.
> --- a/gdb/testsuite/gdb.base/attach.exp
> +++ b/gdb/testsuite/gdb.base/attach.exp
> @@ -58,6 +58,37 @@ if [get_compiler_info] {
> return -1
> }
>
> +# Start the program running and then wait for a bit, to be sure that
> +# it can be attached to. Return the process's PID.
> +
> +proc spawn_test_prog { executable } {
> + set testpid [eval exec $executable &]
> + exec sleep 2
Unrelated to this patch - this patch only moved the code. Also the code move
could be a separate patch:
I do not see why the testsuite commonly uses "exec sleep" while it also uses
"sleep" itself which also works fine.
> + if { [istarget "*-*-cygwin*"] } {
> + # testpid is the Cygwin PID, GDB uses the Windows PID, which might be
> + # different due to the way fork/exec works.
> + set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ]
> + }
> +
> + return $testpid
> +}
[...]
> @@ -429,6 +427,50 @@ proc do_command_attach_tests {} {
> remote_exec build "kill -9 ${testpid}"
> }
>
> +# Test ' gdb --pid PID -ex "run" '. GDB used to have a bug where
> +# "run" would run before the attach finished - PR17347.
> +
> +proc test_command_line_attach_run {} {
> + global gdb_prompt
> + global binfile
> + global verbose
> + global GDB
> + global INTERNAL_GDBFLAGS
These 3 lines are unused.
> +
> + if ![isnative] then {
> + unsupported "commandline attach run test"
> + return 0
> + }
> +
> + with_test_prefix "cmdline attach run" {
> + set testpid [spawn_test_prog $binfile]
> +
> + set test "run to prompt"
> + gdb_exit
> + set res [gdb_spawn_with_cmdline_opts "--pid=$testpid -ex \"start\""]
Here see the attachment.
> + if { $res != 0} {
> + fail $test
> + return $res
> + }
> + gdb_test_multiple "" $test {
> + -re {Attaching to.*Start it from the beginning\? \(y or n\) } {
> + pass $test
> + }
> + }
> +
> + send_gdb "y\n"
> +
> + set test "run to main"
> + gdb_test_multiple "" $test {
> + -re "Temporary breakpoint .* main .*$gdb_prompt $" {
> + pass $test
> + }
> + }
> +
> + # Get rid of the process
> + remote_exec build "kill -9 ${testpid}"
> + }
> +}
>
> # Start with a fresh gdb
>
> @@ -453,4 +495,6 @@ do_call_attach_tests
>
> do_command_attach_tests
>
> +test_command_line_attach_run
> +
> return 0
> diff --git a/gdb/top.c b/gdb/top.c
> index fc2b84d..ba71f8f 100644
> --- a/gdb/top.c
> +++ b/gdb/top.c
> @@ -373,6 +373,21 @@ check_frame_language_change (void)
> }
> }
>
Missing:
/* See top.h. */
Unless that rule from me has been abandoned.
> +void
> +maybe_wait_sync_command_done (int was_sync)
> +{
> + /* If the interpreter is in sync mode (we're running a user
> + command's list, running command hooks or similars), and we
> + just ran a synchronous command that started the target, wait
> + for that command to end. */
> + if (!interpreter_async && !was_sync && sync_execution)
> + {
> + while (gdb_do_one_event () >= 0)
> + if (!sync_execution)
> + break;
> + }
> +}
> +
> /* Execute the line P as a command, in the current user context.
> Pass FROM_TTY as second argument to the defining function. */
>
Thanks,
Jan
--a8Wt8u1KmwUX3Y2C
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline; filename=1
diff --git a/gdb/testsuite/gdb.base/attach.exp b/gdb/testsuite/gdb.base/attach.exp
index c94c127..6e566a3 100644
--- a/gdb/testsuite/gdb.base/attach.exp
+++ b/gdb/testsuite/gdb.base/attach.exp
@@ -447,7 +444,8 @@ proc test_command_line_attach_run {} {
set test "run to prompt"
gdb_exit
- set res [gdb_spawn_with_cmdline_opts "--pid=$testpid -ex \"start\""]
+ set res [gdb_spawn_with_cmdline_opts \
+ "-iex set\\ height\\ 0 -iex set\\ width\\ 0 --pid=$testpid -ex \"start\""]
if { $res != 0} {
fail $test
return $res
--a8Wt8u1KmwUX3Y2C--

View File

@ -33,10 +33,10 @@ gdb/testsuite/
gdb_breakpoint, gdb_continue_to_breakpoint.
(test_command_line_attach_run): Kill ${testpid} in one exit path.
diff --git a/gdb/testsuite/gdb.base/attach.c b/gdb/testsuite/gdb.base/attach.c
index 0041b47..91b180c 100644
--- a/gdb/testsuite/gdb.base/attach.c
+++ b/gdb/testsuite/gdb.base/attach.c
Index: gdb-7.8.1/gdb/testsuite/gdb.base/attach.c
===================================================================
--- gdb-7.8.1.orig/gdb/testsuite/gdb.base/attach.c 2014-10-30 20:23:01.311595725 +0100
+++ gdb-7.8.1/gdb/testsuite/gdb.base/attach.c 2014-10-30 20:23:38.653574999 +0100
@@ -5,6 +5,7 @@
exit unless/until gdb sets the variable to non-zero.)
*/
@ -58,10 +58,10 @@ index 0041b47..91b180c 100644
- return 0;
+ return 0; /* postloop */
}
diff --git a/gdb/testsuite/gdb.base/attach.exp b/gdb/testsuite/gdb.base/attach.exp
index 6340496..5fb5c53 100644
--- a/gdb/testsuite/gdb.base/attach.exp
+++ b/gdb/testsuite/gdb.base/attach.exp
Index: gdb-7.8.1/gdb/testsuite/gdb.base/attach.exp
===================================================================
--- gdb-7.8.1.orig/gdb/testsuite/gdb.base/attach.exp 2014-10-30 20:23:01.311595725 +0100
+++ gdb-7.8.1/gdb/testsuite/gdb.base/attach.exp 2014-10-30 20:23:54.151562867 +0100
@@ -256,11 +256,8 @@ proc do_attach_tests {} {
# Verify that the modification really happened.
@ -76,14 +76,11 @@ index 6340496..5fb5c53 100644
# Allow the test process to exit, to cleanup after ourselves.
@@ -451,6 +448,7 @@ proc test_command_line_attach_run {} {
"-iex set\\ height\\ 0 -iex set\\ width\\ 0 --pid=$testpid -ex \"start\""]
@@ -418,6 +415,7 @@ proc test_command_line_attach_run {} {
"-iex \"set height 0\" -iex \"set width 0\" --pid=$testpid -ex \"start\""]
if { $res != 0} {
fail $test
+ remote_exec build "kill -9 ${testpid}"
return $res
}
gdb_test_multiple "" $test {
--RnlQjJ0d97Da+TV1--

View File

@ -37,10 +37,10 @@ gdb/gdbserver/
(linux_create_inferior, linux_tracefork_child): Call it instead of
direct ptrace.
Index: gdb-7.8/gdb/common/linux-ptrace.c
Index: gdb-7.8.1/gdb/common/linux-ptrace.c
===================================================================
--- gdb-7.8.orig/gdb/common/linux-ptrace.c 2014-07-29 19:31:01.893149317 +0200
+++ gdb-7.8/gdb/common/linux-ptrace.c 2014-07-29 19:31:05.806154887 +0200
--- gdb-7.8.1.orig/gdb/common/linux-ptrace.c 2014-10-30 18:33:37.271097644 +0100
+++ gdb-7.8.1/gdb/common/linux-ptrace.c 2014-10-30 18:33:39.641092763 +0100
@@ -32,6 +32,10 @@
#include <stdint.h>
@ -81,10 +81,10 @@ Index: gdb-7.8/gdb/common/linux-ptrace.c
+ "(gdb) shell sudo setsebool deny_ptrace=0"));
+#endif /* HAVE_LIBSELINUX */
+}
Index: gdb-7.8/gdb/common/linux-ptrace.h
Index: gdb-7.8.1/gdb/common/linux-ptrace.h
===================================================================
--- gdb-7.8.orig/gdb/common/linux-ptrace.h 2014-07-29 19:31:01.893149317 +0200
+++ gdb-7.8/gdb/common/linux-ptrace.h 2014-07-29 19:31:05.807154887 +0200
--- gdb-7.8.1.orig/gdb/common/linux-ptrace.h 2014-10-30 18:33:37.271097644 +0100
+++ gdb-7.8.1/gdb/common/linux-ptrace.h 2014-10-30 18:33:39.642092761 +0100
@@ -85,6 +85,7 @@ struct buffer;
extern void linux_ptrace_attach_fail_reason (pid_t pid, struct buffer *buffer);
@ -93,11 +93,11 @@ Index: gdb-7.8/gdb/common/linux-ptrace.h
extern void linux_enable_event_reporting (pid_t pid);
extern void linux_disable_event_reporting (pid_t pid);
extern int linux_supports_tracefork (void);
Index: gdb-7.8/gdb/configure.ac
Index: gdb-7.8.1/gdb/configure.ac
===================================================================
--- gdb-7.8.orig/gdb/configure.ac 2014-07-29 19:31:01.894149319 +0200
+++ gdb-7.8/gdb/configure.ac 2014-07-29 19:31:05.807154887 +0200
@@ -2158,6 +2158,10 @@ case $host_os in
--- gdb-7.8.1.orig/gdb/configure.ac 2014-10-30 18:33:37.272097642 +0100
+++ gdb-7.8.1/gdb/configure.ac 2014-10-30 18:33:39.643092759 +0100
@@ -2161,6 +2161,10 @@ case $host_os in
esac
AC_DEFINE_UNQUOTED(GDBINIT,"$gdbinit",[The .gdbinit filename.])
@ -108,10 +108,10 @@ Index: gdb-7.8/gdb/configure.ac
dnl Handle optional features that can be enabled.
# Support for --with-sysroot is a copy of GDB_AC_WITH_DIR,
Index: gdb-7.8/gdb/gdbserver/configure.ac
Index: gdb-7.8.1/gdb/gdbserver/configure.ac
===================================================================
--- gdb-7.8.orig/gdb/gdbserver/configure.ac 2014-07-29 19:31:01.895149320 +0200
+++ gdb-7.8/gdb/gdbserver/configure.ac 2014-07-29 19:31:05.808154887 +0200
--- gdb-7.8.1.orig/gdb/gdbserver/configure.ac 2014-10-30 18:33:37.273097640 +0100
+++ gdb-7.8.1/gdb/gdbserver/configure.ac 2014-10-30 18:33:39.643092759 +0100
@@ -454,6 +454,10 @@ if $want_ipa ; then
fi
fi
@ -123,10 +123,10 @@ Index: gdb-7.8/gdb/gdbserver/configure.ac
AC_SUBST(GDBSERVER_DEPFILES)
AC_SUBST(GDBSERVER_LIBS)
AC_SUBST(srv_xmlbuiltin)
Index: gdb-7.8/gdb/gdbserver/linux-low.c
Index: gdb-7.8.1/gdb/gdbserver/linux-low.c
===================================================================
--- gdb-7.8.orig/gdb/gdbserver/linux-low.c 2014-07-29 19:31:01.897149323 +0200
+++ gdb-7.8/gdb/gdbserver/linux-low.c 2014-07-29 19:31:05.809154889 +0200
--- gdb-7.8.1.orig/gdb/gdbserver/linux-low.c 2014-10-30 18:33:37.275097636 +0100
+++ gdb-7.8.1/gdb/gdbserver/linux-low.c 2014-10-30 18:33:39.644092757 +0100
@@ -541,6 +541,29 @@ add_lwp (ptid_t ptid)
return lwp;
}
@ -166,10 +166,10 @@ Index: gdb-7.8/gdb/gdbserver/linux-low.c
#ifndef __ANDROID__ /* Bionic doesn't use SIGRTMIN the way glibc does. */
signal (__SIGRTMIN + 1, SIG_DFL);
Index: gdb-7.8/gdb/inf-ptrace.c
Index: gdb-7.8.1/gdb/inf-ptrace.c
===================================================================
--- gdb-7.8.orig/gdb/inf-ptrace.c 2014-07-29 19:31:01.898149324 +0200
+++ gdb-7.8/gdb/inf-ptrace.c 2014-07-29 19:31:05.809154889 +0200
--- gdb-7.8.1.orig/gdb/inf-ptrace.c 2014-10-30 18:33:37.276097634 +0100
+++ gdb-7.8.1/gdb/inf-ptrace.c 2014-10-30 18:33:39.645092755 +0100
@@ -105,7 +105,15 @@ static void
inf_ptrace_me (void)
{
@ -186,10 +186,10 @@ Index: gdb-7.8/gdb/inf-ptrace.c
}
/* Start a new inferior Unix child process. EXEC_FILE is the file to
Index: gdb-7.8/gdb/linux-nat.c
Index: gdb-7.8.1/gdb/linux-nat.c
===================================================================
--- gdb-7.8.orig/gdb/linux-nat.c 2014-07-29 19:31:01.899149326 +0200
+++ gdb-7.8/gdb/linux-nat.c 2014-07-29 19:31:05.811154893 +0200
--- gdb-7.8.1.orig/gdb/linux-nat.c 2014-10-30 18:33:37.277097631 +0100
+++ gdb-7.8.1/gdb/linux-nat.c 2014-10-30 18:33:39.646092753 +0100
@@ -1291,6 +1291,7 @@ linux_nat_create_inferior (struct target
#ifdef HAVE_PERSONALITY
int personality_orig = 0, personality_set = 0;
@ -235,11 +235,11 @@ Index: gdb-7.8/gdb/linux-nat.c
}
static void
Index: gdb-7.8/gdb/config.in
Index: gdb-7.8.1/gdb/config.in
===================================================================
--- gdb-7.8.orig/gdb/config.in 2014-07-29 19:31:01.900149327 +0200
+++ gdb-7.8/gdb/config.in 2014-07-29 19:31:44.600210090 +0200
@@ -219,6 +219,9 @@
--- gdb-7.8.1.orig/gdb/config.in 2014-10-30 18:33:37.278097630 +0100
+++ gdb-7.8.1/gdb/config.in 2014-10-30 18:34:36.165976366 +0100
@@ -216,6 +216,9 @@
/* Define if librpm library is being used. */
#undef HAVE_LIBRPM
@ -249,21 +249,21 @@ Index: gdb-7.8/gdb/config.in
/* Define to 1 if you have the <libunwind-ia64.h> header file. */
#undef HAVE_LIBUNWIND_IA64_H
@@ -354,6 +357,9 @@
@@ -351,6 +354,9 @@
/* Define to 1 if you have the `scm_new_smob' function. */
#undef HAVE_SCM_NEW_SMOB
+/* Define to 1 if you have the <selinux/selinux.h> header file. */
+#undef HAVE_SELINUX_SELINUX_H
+
/* Define to 1 if you have the `setenv' function. */
#undef HAVE_SETENV
/* Define to 1 if you have the `setlocale' function. */
#undef HAVE_SETLOCALE
Index: gdb-7.8/gdb/configure
Index: gdb-7.8.1/gdb/configure
===================================================================
--- gdb-7.8.orig/gdb/configure 2014-07-29 19:31:01.903149331 +0200
+++ gdb-7.8/gdb/configure 2014-07-29 19:31:05.815154898 +0200
@@ -13392,6 +13392,64 @@ cat >>confdefs.h <<_ACEOF
--- gdb-7.8.1.orig/gdb/configure 2014-10-30 18:33:37.281097623 +0100
+++ gdb-7.8.1/gdb/configure 2014-10-30 18:33:39.649092747 +0100
@@ -13400,6 +13400,64 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
@ -328,10 +328,10 @@ Index: gdb-7.8/gdb/configure
# Support for --with-sysroot is a copy of GDB_AC_WITH_DIR,
# except that the argument to --with-sysroot is optional.
Index: gdb-7.8/gdb/gdbserver/config.in
Index: gdb-7.8.1/gdb/gdbserver/config.in
===================================================================
--- gdb-7.8.orig/gdb/gdbserver/config.in 2014-07-29 19:31:01.904149333 +0200
+++ gdb-7.8/gdb/gdbserver/config.in 2014-07-29 19:31:05.815154898 +0200
--- gdb-7.8.1.orig/gdb/gdbserver/config.in 2014-10-30 18:33:37.282097621 +0100
+++ gdb-7.8.1/gdb/gdbserver/config.in 2014-10-30 18:33:39.649092747 +0100
@@ -81,6 +81,9 @@
/* Define to 1 if you have the `mcheck' library (-lmcheck). */
#undef HAVE_LIBMCHECK
@ -352,10 +352,10 @@ Index: gdb-7.8/gdb/gdbserver/config.in
/* Define to 1 if you have the <sgtty.h> header file. */
#undef HAVE_SGTTY_H
Index: gdb-7.8/gdb/gdbserver/configure
Index: gdb-7.8.1/gdb/gdbserver/configure
===================================================================
--- gdb-7.8.orig/gdb/gdbserver/configure 2014-07-29 19:31:01.905149334 +0200
+++ gdb-7.8/gdb/gdbserver/configure 2014-07-29 19:31:05.817154901 +0200
--- gdb-7.8.1.orig/gdb/gdbserver/configure 2014-10-30 18:33:37.283097619 +0100
+++ gdb-7.8.1/gdb/gdbserver/configure 2014-10-30 18:33:39.650092745 +0100
@@ -6170,6 +6170,64 @@ if $want_ipa ; then
fi
fi

View File

@ -1,85 +0,0 @@
http://sourceware.org/ml/gdb-patches/2014-08/msg00045.html
Subject: [patch] Fix --with-babeltrace with gcc-4.9.1
--qMm9M+Fa2AknHoGS
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Hi,
when I tried to use --with-babeltrace on Fedora Rawhide x86_64
using gcc-4.9.1-3.fc22.x86_64 I got:
checking for libbabeltrace... no
configure: error: babeltrace is missing or unusable
Makefile:7973: recipe for target 'configure-gdb' failed
configure:15890: checking for libbabeltrace
configure:15918: gcc -o conftest -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Werror -static-libstdc++ -static-libgcc -Wl,-z,relro conftest.c -lselinux -lncurses -lz -lm -ldl /usr/lib64/libbabeltrace.so /usr/lib64/libbabeltrace-ctf.so >&5
conftest.c: In function 'main':
conftest.c:198:21: error: unused variable 'pos' [-Werror=unused-variable]
struct bt_iter_pos *pos = bt_iter_get_pos (bt_ctf_get_iter (NULL));
^
cc1: all warnings being treated as errors
configure:15918: $? = 1
configure: failed program was:
The patch below fixes it for me.
In configure.ac there is above this check:
# Append -Werror to CFLAGS so that configure can catch the warning
# "assignment from incompatible pointer type", which is related to
# the babeltrace change from 1.0.3 to 1.1.0. Babeltrace 1.1.0 works
# in GDB, while babeltrace 1.0.3 is broken.
# AC_LIB_HAVE_LINKFLAGS may modify CPPFLAGS in it, so it should be
# safe to save and restore CFLAGS here.
saved_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -Werror"
Maybe it would be easier to use there:
CFLAGS="$CFLAGS -Werror -Wno-unused-variable"
But maybe -Werror is cross-compiler compatible while -Wno-unused-variable is
not, I have no idea.
Jan
--qMm9M+Fa2AknHoGS
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline; filename="gdb-babeltrace-configure.patch"
gdb/
2014-08-04 Jan Kratochvil <jan.kratochvil@redhat.com>
* configure.ac (--with-babeltrace): Use 'pos'.
* configure: Regenerate.
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 70d0964..07d2f00 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -2437,6 +2437,7 @@ else
struct bt_ctf_event *event = NULL;
const struct bt_definition *scope;
+ (void) pos; /* Prevent -Werror=unused-variable. */
scope = bt_ctf_get_top_level_scope (event,
BT_STREAM_EVENT_HEADER);
bt_ctf_get_uint64 (bt_ctf_get_field (event, scope, "id"));
diff --git a/gdb/configure b/gdb/configure
index 809326a..b983d16 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -15344,6 +15344,7 @@ struct bt_iter_pos *pos = bt_iter_get_pos (bt_ctf_get_iter (NULL));
struct bt_ctf_event *event = NULL;
const struct bt_definition *scope;
+ (void) pos; /* Prevent -Werror=unused-variable. */
scope = bt_ctf_get_top_level_scope (event,
BT_STREAM_EVENT_HEADER);
bt_ctf_get_uint64 (bt_ctf_get_field (event, scope, "id"));
--qMm9M+Fa2AknHoGS--

View File

@ -1,237 +0,0 @@
http://sourceware.org/ml/gdb-patches/2014-08/msg00376.html
Subject: Re: --with-babeltrace generates many FAILs
On 08/19/2014 10:07 PM, Jan Kratochvil wrote:
> * '#if HAVE_LIBBABELTRACE1_1_0' could have a comment that >=1.1.1 rejects the
> faked packet (what you described in the mail but not in the patch).
Fixed. To be precise, >= 1.1.2 rejects the faked packet, 1.1.1
doesn't. See the table I posted.
> * It is always better to check for feature/defect than to check for version.
> For example because various distros backport various fixes (unfortunately
> including their possible regressions/defects) and so version checks may be
> misleading then. At least in this case it seems to me as possible to check
> how libbacktrace behaves from configure; although maybe it is not easy
> enough, not sure.
In order to check libbabeltrace's behaviour in configure, we have to write
a c program to generate CTF data and read the trace data via
babeltrace or any program (using libbabeltrace) written by ourselves.
It is not easy to do so.
The patch is updated. OK to apply?
--
Yao (齐尧)
Subject: [PATCH] Check babeltrace 1.1.0
Subject: [PATCH] Check babeltrace 1.1.0
When GDB uses recent version of babeltrace, such as 1.2.x, we'll see
such error emitted from babeltrace library,
(gdb) target ctf .../gdb/testsuite/gdb.trace/actions.ctf
[error] Invalid CTF stream: content size is smaller than
packet headers.
[error] Stream index creation error.
[error] Open file stream error.
The problem can be reproduce out of GDB too, using babeltrace,
$ babeltrace ./fake-packet.ctf/
[error] Invalid CTF stream: content size is smaller than packet headers.
[error] Stream index creation error.
[error] Open file stream error.
Recent babeltrace library becomes more strict on CTF, and complains
about one "faked packet" GDB adds, when saving trace data in ctf
format from GDB. babeltrace 1.1.0 has a bug that it can't read trace
data smaller than a certain size (see https://bugs.lttng.org/issues/450).
We workaround it in GDB to append some meaningless data in a faked
packet to make sure trace file is large enough (see ctf.c:ctf_end).
The babeltrace issue was fixed in 1.1.1 release. However, babeltrace
recent release (since 1.1.2) starts to complain about such faked
packet. Here is a table shows that whether faked packet or no faked
packet is supported by various babeltrace releases,
faked packet no faked packet
1.1.0 Yes No
1.1.1 Yes Yes
1.1.2 No Yes
1.2.0 No Yes
We decide to include the code to workaround 1.1.0 issue only if 1.1.0
is used. We choose pkg-config to check babeltrace's version in
configure.
gdb:
2014-08-20 Yao Qi <yao@codesourcery.com>
* configure.ac: Disable babeltrace support if pkg-config is
missing. Use pkg-config to check whether libbabeltrace is
1.1.0.
* config.in: Regenerate.
* configure: Regenerate.
* ctf.c (CTF_FILE_MIN_SIZE): Remove.
(ctf_end): Wrap the code with
#if HAVE_LIBBABELTRACE1_1_0 #endif.
[HAVE_LIBBABELTRACE1_1_0] (CTF_FILE_MIN_SIZE): New macro.
---
gdb/config.in | 3 +++
gdb/configure | 25 +++++++++++++++++++++++++
gdb/configure.ac | 22 ++++++++++++++++++++++
gdb/ctf.c | 25 ++++++++++++++++---------
4 files changed, 66 insertions(+), 9 deletions(-)
diff --git a/gdb/config.in b/gdb/config.in
index b853412..54152cd 100644
--- a/gdb/config.in
+++ b/gdb/config.in
@@ -183,6 +183,9 @@
/* Define if you have the babeltrace library. */
#undef HAVE_LIBBABELTRACE
+/* Define to 1 if you have libbabeltrace 1.1.0 */
+#undef HAVE_LIBBABELTRACE1_1_0
+
/* Define to 1 if you have the `dl' library (-ldl). */
#undef HAVE_LIBDL
diff --git a/gdb/configure b/gdb/configure
index 9253e28..d4e2c6e 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -14817,6 +14817,11 @@ $as_echo "$with_babeltrace" >&6; }
if test "x$with_babeltrace" = "xno"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: babletrace support disabled; GDB is unable to read CTF data." >&5
$as_echo "$as_me: WARNING: babletrace support disabled; GDB is unable to read CTF data." >&2;}
+elif test "${pkg_config_prog_path}" = "missing"; then
+ # pkg-config is used to check the version of libbabeltrace. If pkg-config
+ # is missing, we have to disable babeltrace support.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pkg-config not found, babletrace support disabled" >&5
+$as_echo "$as_me: WARNING: pkg-config not found, babletrace support disabled" >&2;}
else
# Append -Werror to CFLAGS so that configure can catch the warning
# "assignment from incompatible pointer type", which is related to
@@ -15307,6 +15312,26 @@ $as_echo "$LIBBABELTRACE" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: babeltrace is missing or unusable; GDB is unable to read CTF data." >&5
$as_echo "$as_me: WARNING: babeltrace is missing or unusable; GDB is unable to read CTF data." >&2;}
fi
+ else
+ # Need to know whether libbabeltrace is 1.1.0.
+ pkg_config_path=
+ for x in $LTLIBBABELTRACE; do
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -d "$dir/pkgconfig"; then
+ pkg_config_path="${pkg_config_path}${pkg_config_path:+:}$dir/pkgconfig"
+ fi
+ ;;
+ esac
+ done
+
+ `PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$pkg_config_path ${pkg_config_prog_path} babeltrace = 1.1.0`
+ if test "$?" -eq 0 ; then
+
+$as_echo "#define HAVE_LIBBABELTRACE1_1_0 1" >>confdefs.h
+
+ fi
fi
fi
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 61919b4..1d8d400 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -2420,6 +2420,10 @@ AC_MSG_RESULT([$with_babeltrace])
if test "x$with_babeltrace" = "xno"; then
AC_MSG_WARN([babletrace support disabled; GDB is unable to read CTF data.])
+elif test "${pkg_config_prog_path}" = "missing"; then
+ # pkg-config is used to check the version of libbabeltrace. If pkg-config
+ # is missing, we have to disable babeltrace support.
+ AC_MSG_WARN([pkg-config not found, babletrace support disabled])
else
# Append -Werror to CFLAGS so that configure can catch the warning
# "assignment from incompatible pointer type", which is related to
@@ -2450,6 +2454,24 @@ else
else
AC_MSG_WARN([babeltrace is missing or unusable; GDB is unable to read CTF data.])
fi
+ else
+ # Need to know whether libbabeltrace is 1.1.0.
+ pkg_config_path=
+ for x in $LTLIBBABELTRACE; do
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -d "$dir/pkgconfig"; then
+ pkg_config_path="${pkg_config_path}${pkg_config_path:+:}$dir/pkgconfig"
+ fi
+ ;;
+ esac
+ done
+
+ `PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$pkg_config_path ${pkg_config_prog_path} babeltrace = 1.1.0`
+ if test "$?" -eq 0 ; then
+ AC_DEFINE([HAVE_LIBBABELTRACE1_1_0], [1], [Define to 1 if you have libbabeltrace 1.1.0])
+ fi
fi
fi
diff --git a/gdb/ctf.c b/gdb/ctf.c
index df645c0..684da50 100644
--- a/gdb/ctf.c
+++ b/gdb/ctf.c
@@ -623,11 +623,6 @@ ctf_write_definition_end (struct trace_file_writer *self)
self->ops->frame_ops->end (self);
}
-/* The minimal file size of data stream. It is required by
- babeltrace. */
-
-#define CTF_FILE_MIN_SIZE 4096
-
/* This is the implementation of trace_file_write_ops method
end. */
@@ -637,10 +632,21 @@ ctf_end (struct trace_file_writer *self)
struct ctf_trace_file_writer *writer = (struct ctf_trace_file_writer *) self;
gdb_assert (writer->tcs.content_size == 0);
- /* The babeltrace requires or assumes that the size of datastream
- file is greater than 4096 bytes. If we don't generate enough
- packets and events, create a fake packet which has zero event,
- to use up the space. */
+
+#if HAVE_LIBBABELTRACE1_1_0
+ /* The babeltrace-1.1.0 requires or assumes that the size of datastream
+ file is greater than 4096 bytes. This was fixed after 1.1.0 release.
+ See https://bugs.lttng.org/issues/450
+ If we don't generate enough packets and events, create a fake packet
+ which has zero event, to use up the space. However, babeltrace
+ release (since 1.1.2) starts to complain about such faked packet,
+ we include this workaround only for babeltrace 1.1.0. */
+
+ /* The minimal file size of data stream. It is required by
+ babeltrace. */
+
+#define CTF_FILE_MIN_SIZE 4096
+
if (writer->tcs.packet_start < CTF_FILE_MIN_SIZE)
{
uint32_t u32;
@@ -681,6 +687,7 @@ ctf_end (struct trace_file_writer *self)
ctf_save_write (&writer->tcs, &b, 1);
}
}
+#endif /* HAVE_LIBBABELTRACE1_1_0 */
}
/* This is the implementation of trace_frame_write_ops method
--
1.9.3

File diff suppressed because it is too large Load Diff

View File

@ -22,17 +22,17 @@ Name: %{?scl_prefix}gdb
# See timestamp of source gnulib installed into gdb/gnulib/ .
%global snapgnulib 20121213
%global tarname gdb-%{version}
Version: 7.8
Version: 7.8.1
# The release always contains a leading reserved number, start it at 1.
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
Release: 29%{?dist}
Release: 30%{?dist}
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain and GFDL
Group: Development/Debuggers
# Do not provide URL for snapshots as the file lasts there only for 2 days.
# ftp://sourceware.org/pub/gdb/releases/gdb-%{version}.tar.gz
Source: %{tarname}.tar.gz
# ftp://sourceware.org/pub/gdb/releases/gdb-%{version}.tar.xz
Source: ftp://sourceware.org/pub/gdb/releases/%{tarname}.tar.xz
Buildroot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
URL: http://gnu.org/software/gdb/
@ -524,20 +524,10 @@ Patch921: gdb-python-completer-2of2.patch
# Display Fortran strings in backtraces.
Patch925: gdb-fortran-frame-string.patch
# Fix -Werror=unused-variable error configuring babeltrace.
# Fix babeltrace errors (Yao Qi).
Patch926: gdb-babeltrace-configure.patch
Patch928: gdb-babeltrace-minsize.patch
# Fix Python GIL with gdb.execute("continue") (Phil Muldoon, BZ 1116957).
Patch927: gdb-python-gil.patch
# Fix crash on Python frame filters with unreadable arg (BZ 1126177).
Patch929: python-framefilter-invalidarg.patch
# Fix GDB SIGTT* Stopped when using the PID argument (BZ 1136704, Pedro Alves).
Patch930: gdb-async-stopped-on-pid-arg-1of2.patch
Patch931: gdb-async-stopped-on-pid-arg-2of2.patch
Patch970: gdb-async-stopped-on-pid-arg-testsuite.patch
# Fix "save breakpoints" for signal catchpoints and disabled breakpoints
@ -833,12 +823,7 @@ find -name "*.info*"|xargs rm -f
%patch920 -p1
%patch921 -p1
%patch925 -p1
%patch926 -p1
%patch928 -p1
%patch927 -p1
%patch929 -p1
%patch930 -p1
%patch931 -p1
%patch970 -p1
%patch971 -p1
%patch973 -p1
@ -1343,6 +1328,9 @@ then
fi
%changelog
* Thu Oct 30 2014 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.8.1-30.fc21
- Rebase to FSF GDB 7.8.1.
* Mon Oct 27 2014 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.8-29.fc21
- Backport vDSO regression.
- Revert the makeinfo workaround from 7.8-27.fc21.

View File

@ -1,596 +0,0 @@
http://sourceware.org/ml/gdb-patches/2014-08/msg00364.html
Subject: [patch+7.8?] Fix crash on Python frame filters with unreadable arg
--d6Gm4EdcadzBjdND
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Hi,
https://bugzilla.redhat.com/show_bug.cgi?id=1126177
ERROR: AddressSanitizer: SEGV on unknown address 0x000000000050 (pc 0x000000992bef sp 0x7ffff9039530 bp 0x7ffff9039540 T0)
#0 0x992bee in value_type .../gdb/value.c:925
#1 0x87c951 in py_print_single_arg python/py-framefilter.c:445
#2 0x87cfae in enumerate_args python/py-framefilter.c:596
#3 0x87e0b0 in py_print_args python/py-framefilter.c:968
It crashes because frame_arg::val is documented it may contain NULL
(frame_arg::error is then non-NULL) but the code does not handle it.
Another bug is that py_print_single_arg() calls goto out of its TRY_CATCH
which messes up GDB cleanup chain crashing GDB later.
I tried to somehow separate it to two patches first but it in the end kept
them merged.
No regressions on {x86_64,x86_64-m32,i686}-fedorarawhide-linux-gnu.
It is probably 7.7 regression (I have not verified it) due to the introduction
of Python frame filters.
I am not sure if it is more suitable for gdb.arch/ or gdb.python/ , used the
latter.
Thanks,
Jan
--d6Gm4EdcadzBjdND
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline; filename="pyinvalidarg.patch"
gdb/
2014-08-19 Jan Kratochvil <jan.kratochvil@redhat.com>
* python/py-framefilter.c (py_print_single_arg): Handle NULL FA->VAL.
Fix goto out of TRY_CATCH.
gdb/testsuite/
2014-08-19 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.python/amd64-py-framefilter-invalidarg.S: New file.
* gdb.python/py-framefilter-invalidarg-gdb.py.in: New file.
* gdb.python/py-framefilter-invalidarg.exp: New file.
* gdb.python/py-framefilter-invalidarg.py: New file.
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index 9db83c7..d53282f 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -365,9 +365,12 @@ py_print_single_arg (struct ui_out *out,
{
struct value *val;
volatile struct gdb_exception except;
+ enum ext_lang_bt_status retval = EXT_LANG_BT_OK;
if (fa != NULL)
{
+ if (fa->val == NULL && fa->error == NULL)
+ return EXT_LANG_BT_OK;
language = language_def (SYMBOL_LANGUAGE (fa->sym));
val = fa->val;
}
@@ -433,16 +436,18 @@ py_print_single_arg (struct ui_out *out,
/* For MI print the type, but only for simple values. This seems
weird, but this is how MI choose to format the various output
types. */
- if (args_type == MI_PRINT_SIMPLE_VALUES)
+ if (args_type == MI_PRINT_SIMPLE_VALUES && val != NULL)
{
if (py_print_type (out, val) == EXT_LANG_BT_ERROR)
{
+ retval = EXT_LANG_BT_ERROR;
do_cleanups (cleanups);
- goto error;
+ continue;
}
}
- annotate_arg_value (value_type (val));
+ if (val != NULL)
+ annotate_arg_value (value_type (val));
/* If the output is to the CLI, and the user option "set print
frame-arguments" is set to none, just output "...". */
@@ -454,27 +459,25 @@ py_print_single_arg (struct ui_out *out,
for the case of MI_PRINT_NO_VALUES. */
if (args_type != NO_VALUES)
{
- if (py_print_value (out, val, opts, 0, args_type, language)
- == EXT_LANG_BT_ERROR)
+ if (val == NULL)
{
- do_cleanups (cleanups);
- goto error;
+ gdb_assert (fa != NULL && fa->error != NULL);
+ ui_out_field_fmt (out, "value",
+ _("<error reading variable: %s>"),
+ fa->error);
}
+ else if (py_print_value (out, val, opts, 0, args_type, language)
+ == EXT_LANG_BT_ERROR)
+ retval = EXT_LANG_BT_ERROR;
}
}
do_cleanups (cleanups);
}
if (except.reason < 0)
- {
- gdbpy_convert_exception (except);
- goto error;
- }
-
- return EXT_LANG_BT_OK;
+ gdbpy_convert_exception (except);
- error:
- return EXT_LANG_BT_ERROR;
+ return retval;
}
/* Helper function to loop over frame arguments provided by the
diff --git a/gdb/testsuite/gdb.python/amd64-py-framefilter-invalidarg.S b/gdb/testsuite/gdb.python/amd64-py-framefilter-invalidarg.S
new file mode 100755
index 0000000..3ac1b23
--- /dev/null
+++ b/gdb/testsuite/gdb.python/amd64-py-framefilter-invalidarg.S
@@ -0,0 +1,261 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2014 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 is compiled from a single line
+ int main (int argc, char **argv) { return 0; }
+ using -g -dA -S -O2 and patched as #if-ed below. */
+
+ .file "py-framefilter-invalidarg.c"
+ .text
+.Ltext0:
+ .globl main
+ .type main, @function
+main:
+.LFB0:
+ .file 1 "py-framefilter-invalidarg.c"
+ # py-framefilter-invalidarg.c:1
+ .loc 1 1 0
+ .cfi_startproc
+# BLOCK 2 seq:0
+# PRED: ENTRY (FALLTHRU)
+ pushq %rbp
+ .cfi_def_cfa_offset 16
+ .cfi_offset 6, -16
+ movq %rsp, %rbp
+ .cfi_def_cfa_register 6
+ movl %edi, -4(%rbp)
+ movq %rsi, -16(%rbp)
+ # py-framefilter-invalidarg.c:2
+ .loc 1 2 0
+ movl $0, %eax
+ # py-framefilter-invalidarg.c:3
+ .loc 1 3 0
+ popq %rbp
+ .cfi_def_cfa 7, 8
+# SUCC: EXIT [100.0%]
+ ret
+ .cfi_endproc
+.LFE0:
+ .size main, .-main
+.Letext0:
+ .section .debug_info,"",@progbits
+.Ldebug_info0:
+ .long .Le - .Ls # Length of Compilation Unit Info
+.Ls:
+ .value 0x4 # DWARF version number
+ .long .Ldebug_abbrev0 # Offset Into Abbrev. Section
+ .byte 0x8 # Pointer Size (in bytes)
+ .uleb128 0x1 # (DIE (0xb) DW_TAG_compile_unit)
+ .long .LASF3 # DW_AT_producer: "GNU C 4.9.1 20140813 (Red Hat 4.9.1-7) -mtune=generic -march=x86-64 -g"
+ .byte 0x1 # DW_AT_language
+ .long .LASF4 # DW_AT_name: "py-framefilter-invalidarg.c"
+ .long .LASF5 # DW_AT_comp_dir: ""
+ .quad .Ltext0 # DW_AT_low_pc
+ .quad .Letext0-.Ltext0 # DW_AT_high_pc
+ .long .Ldebug_line0 # DW_AT_stmt_list
+die2d:
+ .uleb128 0x2 # (DIE (0x2d) DW_TAG_subprogram)
+ # DW_AT_external
+ .long .LASF6 # DW_AT_name: "main"
+ .byte 0x1 # DW_AT_decl_file (py-framefilter-invalidarg.c)
+ .byte 0x1 # DW_AT_decl_line
+ # DW_AT_prototyped
+ .long die6b-.Ldebug_info0 # DW_AT_type
+ .quad .LFB0 # DW_AT_low_pc
+ .quad .LFE0-.LFB0 # DW_AT_high_pc
+ .uleb128 0x1 # DW_AT_frame_base
+ .byte 0x9c # DW_OP_call_frame_cfa
+ # DW_AT_GNU_all_call_sites
+die4e:
+ .uleb128 0x3 # (DIE (0x4e) DW_TAG_formal_parameter)
+ .long .LASF0 # DW_AT_name: "argc"
+ .byte 0x1 # DW_AT_decl_file (py-framefilter-invalidarg.c)
+ .byte 0x1 # DW_AT_decl_line
+ .long die6b-.Ldebug_info0 # DW_AT_type
+#if 0
+ .uleb128 0x2 # DW_AT_location
+ .byte 0x91 # DW_OP_fbreg
+ .sleb128 -20
+#endif
+#if 0
+ .uleb128 1f - 2f # DW_AT_location
+2:
+ .byte 0x03 # DW_OP_addr
+ .quad 0
+1:
+#endif
+#if 1
+ .uleb128 1f - 2f # DW_AT_location
+2:
+ .byte 0x13 # DW_OP_drop
+ .quad 0
+1:
+#endif
+die5c:
+ .uleb128 0x3 # (DIE (0x5c) DW_TAG_formal_parameter)
+ .long .LASF1 # DW_AT_name: "argv"
+ .byte 0x1 # DW_AT_decl_file (py-framefilter-invalidarg.c)
+ .byte 0x1 # DW_AT_decl_line
+ .long die72-.Ldebug_info0 # DW_AT_type
+ .uleb128 0x2 # DW_AT_location
+ .byte 0x91 # DW_OP_fbreg
+ .sleb128 -32
+ .byte 0 # end of children of DIE 0x2d
+die6b:
+ .uleb128 0x4 # (DIE (0x6b) DW_TAG_base_type)
+ .byte 0x4 # DW_AT_byte_size
+ .byte 0x5 # DW_AT_encoding
+ .ascii "int\0" # DW_AT_name
+die72:
+ .uleb128 0x5 # (DIE (0x72) DW_TAG_pointer_type)
+ .byte 0x8 # DW_AT_byte_size
+ .long die78-.Ldebug_info0 # DW_AT_type
+die78:
+ .uleb128 0x5 # (DIE (0x78) DW_TAG_pointer_type)
+ .byte 0x8 # DW_AT_byte_size
+ .long die7e-.Ldebug_info0 # DW_AT_type
+die7e:
+ .uleb128 0x6 # (DIE (0x7e) DW_TAG_base_type)
+ .byte 0x1 # DW_AT_byte_size
+ .byte 0x6 # DW_AT_encoding
+ .long .LASF2 # DW_AT_name: "char"
+ .byte 0 # end of children of DIE 0xb
+.Le:
+ .section .debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+ .uleb128 0x1 # (abbrev code)
+ .uleb128 0x11 # (TAG: DW_TAG_compile_unit)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x25 # (DW_AT_producer)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x13 # (DW_AT_language)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x1b # (DW_AT_comp_dir)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x12 # (DW_AT_high_pc)
+ .uleb128 0x7 # (DW_FORM_data8)
+ .uleb128 0x10 # (DW_AT_stmt_list)
+ .uleb128 0x17 # (DW_FORM_sec_offset)
+ .byte 0
+ .byte 0
+ .uleb128 0x2 # (abbrev code)
+ .uleb128 0x2e # (TAG: DW_TAG_subprogram)
+ .byte 0x1 # DW_children_yes
+ .uleb128 0x3f # (DW_AT_external)
+ .uleb128 0x19 # (DW_FORM_flag_present)
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x3a # (DW_AT_decl_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3b # (DW_AT_decl_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x27 # (DW_AT_prototyped)
+ .uleb128 0x19 # (DW_FORM_flag_present)
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x11 # (DW_AT_low_pc)
+ .uleb128 0x1 # (DW_FORM_addr)
+ .uleb128 0x12 # (DW_AT_high_pc)
+ .uleb128 0x7 # (DW_FORM_data8)
+ .uleb128 0x40 # (DW_AT_frame_base)
+ .uleb128 0x18 # (DW_FORM_exprloc)
+ .uleb128 0x2117 # (DW_AT_GNU_all_call_sites)
+ .uleb128 0x19 # (DW_FORM_flag_present)
+ .byte 0
+ .byte 0
+ .uleb128 0x3 # (abbrev code)
+ .uleb128 0x5 # (TAG: DW_TAG_formal_parameter)
+ .byte 0 # DW_children_no
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0xe # (DW_FORM_strp)
+ .uleb128 0x3a # (DW_AT_decl_file)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3b # (DW_AT_decl_line)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .uleb128 0x2 # (DW_AT_location)
+ .uleb128 0x18 # (DW_FORM_exprloc)
+ .byte 0
+ .byte 0
+ .uleb128 0x4 # (abbrev code)
+ .uleb128 0x24 # (TAG: DW_TAG_base_type)
+ .byte 0 # DW_children_no
+ .uleb128 0xb # (DW_AT_byte_size)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3e # (DW_AT_encoding)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0x8 # (DW_FORM_string)
+ .byte 0
+ .byte 0
+ .uleb128 0x5 # (abbrev code)
+ .uleb128 0xf # (TAG: DW_TAG_pointer_type)
+ .byte 0 # DW_children_no
+ .uleb128 0xb # (DW_AT_byte_size)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x49 # (DW_AT_type)
+ .uleb128 0x13 # (DW_FORM_ref4)
+ .byte 0
+ .byte 0
+ .uleb128 0x6 # (abbrev code)
+ .uleb128 0x24 # (TAG: DW_TAG_base_type)
+ .byte 0 # DW_children_no
+ .uleb128 0xb # (DW_AT_byte_size)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3e # (DW_AT_encoding)
+ .uleb128 0xb # (DW_FORM_data1)
+ .uleb128 0x3 # (DW_AT_name)
+ .uleb128 0xe # (DW_FORM_strp)
+ .byte 0
+ .byte 0
+ .byte 0
+ .section .debug_aranges,"",@progbits
+ .long 0x2c # Length of Address Ranges Info
+ .value 0x2 # DWARF Version
+ .long .Ldebug_info0 # Offset of Compilation Unit Info
+ .byte 0x8 # Size of Address
+ .byte 0 # Size of Segment Descriptor
+ .value 0 # Pad to 16 byte boundary
+ .value 0
+ .quad .Ltext0 # Address
+ .quad .Letext0-.Ltext0 # Length
+ .quad 0
+ .quad 0
+ .section .debug_line,"",@progbits
+.Ldebug_line0:
+ .section .debug_str,"MS",@progbits,1
+.LASF1:
+ .string "argv"
+.LASF4:
+ .string "py-framefilter-invalidarg.c"
+.LASF5:
+ .string ""
+.LASF0:
+ .string "argc"
+.LASF3:
+ .string "GNU C 4.9.1 20140813 (Red Hat 4.9.1-7) -mtune=generic -march=x86-64 -g"
+.LASF6:
+ .string "main"
+.LASF2:
+ .string "char"
+ .ident "GCC: (GNU) 4.9.1 20140813 (Red Hat 4.9.1-7)"
+ .section .note.GNU-stack,"",@progbits
diff --git a/gdb/testsuite/gdb.python/py-framefilter-invalidarg-gdb.py.in b/gdb/testsuite/gdb.python/py-framefilter-invalidarg-gdb.py.in
new file mode 100644
index 0000000..1fa6ffc
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-framefilter-invalidarg-gdb.py.in
@@ -0,0 +1,48 @@
+# Copyright (C) 2014 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 is part of the GDB testsuite. It tests Python-based
+# frame-filters.
+import gdb
+import itertools
+from gdb.FrameDecorator import FrameDecorator
+
+
+class FrameObjFile ():
+
+ def __init__ (self):
+ self.name = "Filter1"
+ self.priority = 1
+ self.enabled = False
+ gdb.current_progspace().frame_filters ["Progspace" + self.name] = self
+ gdb.current_objfile().frame_filters ["ObjectFile" + self.name] = self
+
+ def filter (self, frame_iter):
+ return frame_iter
+
+class FrameObjFile2 ():
+
+ def __init__ (self):
+ self.name = "Filter2"
+ self.priority = 100
+ self.enabled = True
+ gdb.current_progspace().frame_filters ["Progspace" + self.name] = self
+ gdb.current_objfile().frame_filters ["ObjectFile" + self.name] = self
+
+ def filter (self, frame_iter):
+ return frame_iter
+
+FrameObjFile()
+FrameObjFile2()
diff --git a/gdb/testsuite/gdb.python/py-framefilter-invalidarg.exp b/gdb/testsuite/gdb.python/py-framefilter-invalidarg.exp
new file mode 100644
index 0000000..f70d16e
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-framefilter-invalidarg.exp
@@ -0,0 +1,67 @@
+# Copyright (C) 2014 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/>.
+
+load_lib gdb-python.exp
+
+standard_testfile amd64-py-framefilter-invalidarg.S
+
+if { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
+ verbose "Skipping py-framefilter-invalidarg."
+ return
+}
+
+# We cannot use prepare_for_testing as we have to set the safe-patch
+# to check objfile and progspace printers.
+if {[build_executable $testfile.exp $testfile $srcfile {}] == -1} {
+ return -1
+}
+
+# Start with a fresh gdb.
+gdb_exit
+gdb_start
+
+# Skip all tests if Python scripting is not enabled.
+if { [skip_python_tests] } { continue }
+
+# Make the -gdb.py script available to gdb, it is automagically loaded by gdb.
+# Care is taken to put it in the same directory as the binary so that
+# gdb will find it.
+set remote_obj_python_file \
+ [remote_download \
+ host ${srcdir}/${subdir}/${testfile}-gdb.py.in \
+ [standard_output_file ${testfile}-gdb.py]]
+
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_test_no_output "set auto-load safe-path ${remote_obj_python_file}" \
+ "set auto-load safe-path"
+gdb_load ${binfile}
+# Verify gdb loaded the script.
+gdb_test "info auto-load python-scripts" "Yes.*/${testfile}-gdb.py.*" \
+ "Test auto-load had loaded python scripts"
+
+if ![runto_main] then {
+ perror "couldn't run to breakpoint"
+ return
+}
+gdb_test_no_output "set python print-stack full" \
+ "Set python print-stack to full"
+
+# Load global frame-filters
+set remote_python_file [gdb_remote_download host \
+ ${srcdir}/${subdir}/${testfile}.py]
+gdb_test_no_output "python exec (open ('${remote_python_file}').read ())" \
+ "Load python file"
+
+gdb_test "bt" " in niam \\(argc=<error reading variable: dwarf expression stack underflow>, argv=0x\[0-9a-f\]+\\) at py-framefilter-invalidarg.c:\[0-9\]+" "bt full with filters"
diff --git a/gdb/testsuite/gdb.python/py-framefilter-invalidarg.py b/gdb/testsuite/gdb.python/py-framefilter-invalidarg.py
new file mode 100644
index 0000000..d5f92cb
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-framefilter-invalidarg.py
@@ -0,0 +1,59 @@
+# Copyright (C) 2014 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 is part of the GDB testsuite. It tests Python-based
+# frame-filters.
+import gdb
+import itertools
+from gdb.FrameDecorator import FrameDecorator
+import copy
+
+class Reverse_Function (FrameDecorator):
+
+ def __init__(self, fobj):
+ super(Reverse_Function, self).__init__(fobj)
+ self.fobj = fobj
+
+ def function (self):
+ fname = str (self.fobj.function())
+ if (fname == None or fname == ""):
+ return None
+ if fname == 'end_func':
+ extra = self.fobj.inferior_frame().read_var('str').string()
+ else:
+ extra = ''
+ fname = fname[::-1] + extra
+ return fname
+
+class FrameFilter ():
+
+ def __init__ (self):
+ self.name = "Reverse"
+ self.priority = 100
+ self.enabled = True
+ gdb.frame_filters [self.name] = self
+
+ def filter (self, frame_iter):
+ # Python 3.x moved the itertools.imap functionality to map(),
+ # so check if it is available.
+ if hasattr(itertools, "imap"):
+ frame_iter = itertools.imap (Reverse_Function,
+ frame_iter)
+ else:
+ frame_iter = map(Reverse_Function, frame_iter)
+
+ return frame_iter
+
+FrameFilter()
--d6Gm4EdcadzBjdND--

View File

@ -1,2 +1,2 @@
4981307aa9619bbec5b73261e4e41c8d gdb-libstdc++-v3-python-r155978.tar.bz2
38d816d641093db2e13ba284e26090b4 gdb-7.8.tar.gz
8072be87a94be0936bc3b4b6941b0862 gdb-7.8.1.tar.xz