1 http://sourceware.org/ml/gdb-patches/2009-11/msg00596.html
2 Subject: [gdb FYI-patch] callback-mode readline-6.0 regression
6 FSF GDB currently ships bundled with readline-5.2 which works fine.
7 But using --with-system-readline and readline-6.0-patchlevel4 has
10 readline-5.2: Run `gdb -nx -q' and type CTRL-C:
14 readline-6.0: Run `gdb -nx -q' and type CTRL-C:
16 = nothing happens (it gets buffered and executed later)
17 (It does also FAIL on gdb.gdb/selftest.exp.)
19 It is because GDB waits in its own poll() mainloop and readline uses via
20 rl_callback_handler_install and rl_callback_handler_remove. This way the
21 readline internal variable _rl_interrupt_immediately remains 0 and CTRL-C gets
22 only stored to _rl_caught_signal but not executed.
24 Seen in rl_signal_handler even if _rl_interrupt_immediately is set and
25 _rl_handle_signal is called then the signal is still stored to
26 _rl_caught_signal. In the _rl_interrupt_immediately case it should not be
27 stored when it was already processed.
29 rl_signal_handler does `_rl_interrupt_immediately = 0;' - while I am not aware
30 of its meaning it breaks the nest-counting of other routines which do
31 `_rl_interrupt_immediately++;' and `_rl_interrupt_immediately--;' possibly
32 creating problematic `_rl_interrupt_immediately == -1'.
34 `_rl_interrupt_immediately' is an internal variable, how it could be accessed
35 by a readline application? (OK, maybe it should not be used.)
37 Attaching a current GDB-side patch but it must access readline internal
38 variable _rl_caught_signal and it is generally just a workaround. Could you
39 please include support for signals in this asynchronous mode in readline-6.1?
40 I find it would be enough to make RL_CHECK_SIGNALS public?
43 GDB: No regressions on {x86_64,x86_64-m32,i686}-fedora12-linux-gnu.
44 But this is not a patch intended to be accepted.
52 2009-11-29 Jan Kratochvil <jan.kratochvil@redhat.com>
54 * config.in, configure: Regenerate.
55 * configure.ac (for readline_echoing_p): Move inside $LIBS change.
56 (for _rl_caught_signal): New.
57 * event-loop.c: Include readline/readline.h.
58 (gdb_do_one_event) [HAVE_READLINE_CAUGHT_SIGNAL]: New.
61 2009-11-29 Jan Kratochvil <jan.kratochvil@redhat.com>
63 * gdb.gdb/selftest.exp (backtrace through signal handler): Move before
64 SIGINT pass, drop the timeout case.
65 (send SIGINT signal to child process): Use gdb_test.
66 (backtrace through readline handler): New.
71 /* Define if Python interpreter is being linked in. */
74 +/* readline-6.0 workaround of blocked signals. */
75 +#undef HAVE_READLINE_CAUGHT_SIGNAL
77 /* Define to 1 if you have the `realpath' function. */
80 --- a/gdb/configure.ac
81 +++ b/gdb/configure.ac
82 @@ -539,17 +539,25 @@ if test "$with_system_readline" = yes; then
83 # readline-6.0 started to use the name `_rl_echoing_p'.
84 # `$(READLINE_DIR)/' of bundled readline would not resolve in configure.
86 - AC_MSG_CHECKING([for readline_echoing_p])
88 LIBS="$LIBS $READLINE"
89 + AC_MSG_CHECKING([for readline_echoing_p])
90 AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int readline_echoing_p;
91 return readline_echoing_p;]]),
92 [READLINE_ECHOING_P=yes],
93 [READLINE_ECHOING_P=no
94 AC_DEFINE([readline_echoing_p], [_rl_echoing_p],
95 [readline-6.0 started to use different name.])])
97 AC_MSG_RESULT([$READLINE_ECHOING_P])
98 + AC_MSG_CHECKING([for _rl_caught_signal])
99 + AC_LINK_IFELSE(AC_LANG_PROGRAM(,[[extern int volatile _rl_caught_signal;
100 + return _rl_caught_signal;]]),
101 + [READLINE_CAUGHT_SIGNAL=yes
102 + AC_DEFINE([HAVE_READLINE_CAUGHT_SIGNAL],,
103 + [readline-6.0 workaround of blocked signals.])],
104 + [READLINE_CAUGHT_SIGNAL=no])
105 + AC_MSG_RESULT([$READLINE_CAUGHT_SIGNAL])
108 READLINE='$(READLINE_DIR)/libreadline.a'
109 READLINE_DEPS='$(READLINE)'
110 --- a/gdb/event-loop.c
111 +++ b/gdb/event-loop.c
113 #include "exceptions.h"
114 #include "gdb_assert.h"
115 #include "gdb_select.h"
116 +#include "readline/readline.h"
118 /* Data point to pass to the event handler. */
119 typedef union event_data
120 @@ -411,6 +412,9 @@ gdb_do_one_event (void *data)
121 static int event_source_head = 0;
122 const int number_of_sources = 3;
124 +#ifdef HAVE_READLINE_CAUGHT_SIGNAL
125 + extern int volatile _rl_caught_signal;
128 /* Any events already waiting in the queue? */
129 if (process_event ())
130 @@ -455,6 +459,16 @@ gdb_do_one_event (void *data)
131 if (gdb_wait_for_event (1) < 0)
134 +#ifdef HAVE_READLINE_CAUGHT_SIGNAL
135 + if (async_command_editing_p && RL_ISSTATE (RL_STATE_CALLBACK)
136 + && _rl_caught_signal)
138 + /* Call RL_CHECK_SIGNALS this way. */
139 + rl_callback_handler_remove ();
140 + rl_callback_handler_install (NULL, input_handler);
144 /* Handle any new events occurred while waiting. */
145 if (process_event ())
147 --- a/gdb/testsuite/gdb.gdb/selftest.exp
148 +++ b/gdb/testsuite/gdb.gdb/selftest.exp
149 @@ -464,31 +464,42 @@ GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\
150 fail "$description (timeout)"
154 - set description "send SIGINT signal to child process"
155 - send_gdb "signal SIGINT\n"
157 - -re "Continuing with signal SIGINT.*$gdb_prompt $" {
159 + # get a stack trace with the poll function
161 + # This fails on some linux systems for unknown reasons. On the
162 + # systems where it fails, sometimes it works fine when run manually.
163 + # The testsuite failures may not be limited to just aout systems.
164 + setup_xfail "i*86-pc-linuxaout-gnu"
165 + set description "backtrace through signal handler"
166 + gdb_test_multiple "backtrace" $description {
167 + -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
170 -re ".*$gdb_prompt $" {
171 + # On the alpha, we hit the infamous problem about gdb
172 + # being unable to get the frame pointer (mentioned in
173 + # gdb/README). As it is intermittent, there is no way to
174 + # XFAIL it which will give us an XPASS if the problem goes
176 + setup_xfail "alpha*-*-osf*"
180 - fail "$description (timeout)"
184 - # get a stack trace
185 + gdb_test "signal SIGINT" "Continuing with signal SIGINT.*" \
186 + "send SIGINT signal to child process"
188 + # get a stack trace being redelivered by readline
190 # This fails on some linux systems for unknown reasons. On the
191 # systems where it fails, sometimes it works fine when run manually.
192 # The testsuite failures may not be limited to just aout systems.
193 + # Optional system readline may not have symbols to be shown.
194 setup_xfail "i*86-pc-linuxaout-gnu"
195 - set description "backtrace through signal handler"
196 - send_gdb "backtrace\n"
198 - -re "#0.*(read|poll).*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
199 + set description "backtrace through readline handler"
200 + gdb_test_multiple "backtrace" $description {
201 + -re "#0.*gdb_do_one_event.*in main \\(.*\\) at .*gdb\\.c.*$gdb_prompt $" {
204 -re ".*$gdb_prompt $" {
205 @@ -500,9 +510,6 @@ GDB.*Copyright \[0-9\]+ Free Software Foundation, Inc..*$gdb_prompt $"\
206 setup_xfail "alpha*-*-osf*"
210 - fail "$description (timeout)"
215 --- gdb-7.0/gdb/configure 2009-12-07 18:53:30.000000000 +0100
216 +++ gdb-7.0-x/gdb/configure 2009-12-07 18:53:14.000000000 +0100
217 @@ -9201,15 +9201,11 @@ if test "$with_system_readline" = yes; t
218 # readline-6.0 started to use the name `_rl_echoing_p'.
219 # `$(READLINE_DIR)/' of bundled readline would not resolve in configure.
221 - echo "$as_me:$LINENO: checking for readline_echoing_p" >&5
222 -echo $ECHO_N "checking for readline_echoing_p... $ECHO_C" >&6
224 LIBS="$LIBS $READLINE"
225 - cat >conftest.$ac_ext <<_ACEOF
228 -cat confdefs.h >>conftest.$ac_ext
229 -cat >>conftest.$ac_ext <<_ACEOF
230 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline_echoing_p" >&5
231 +$as_echo_n "checking for readline_echoing_p... " >&6; }
232 + cat confdefs.h - <<_ACEOF >conftest.$ac_ext
233 /* end confdefs.h. */
236 @@ -9221,45 +9217,45 @@ extern int readline_echoing_p;
240 -rm -f conftest.$ac_objext conftest$ac_exeext
241 -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
242 - (eval $ac_link) 2>conftest.er1
244 - grep -v '^ *+' conftest.er1 >conftest.err
246 - cat conftest.err >&5
247 - echo "$as_me:$LINENO: \$? = $ac_status" >&5
248 - (exit $ac_status); } &&
249 - { ac_try='test -z "$ac_c_werror_flag"
250 - || test ! -s conftest.err'
251 - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
252 - (eval $ac_try) 2>&5
254 - echo "$as_me:$LINENO: \$? = $ac_status" >&5
255 - (exit $ac_status); }; } &&
256 - { ac_try='test -s conftest$ac_exeext'
257 - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
258 - (eval $ac_try) 2>&5
260 - echo "$as_me:$LINENO: \$? = $ac_status" >&5
261 - (exit $ac_status); }; }; then
262 +if ac_fn_c_try_link "$LINENO"; then :
263 READLINE_ECHOING_P=yes
265 - echo "$as_me: failed program was:" >&5
266 -sed 's/^/| /' conftest.$ac_ext >&5
267 + READLINE_ECHOING_P=no
269 -READLINE_ECHOING_P=no
270 +$as_echo "#define readline_echoing_p _rl_echoing_p" >>confdefs.h
273 +rm -f core conftest.err conftest.$ac_objext \
274 + conftest$ac_exeext conftest.$ac_ext
275 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_ECHOING_P" >&5
276 +$as_echo "$READLINE_ECHOING_P" >&6; }
277 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _rl_caught_signal" >&5
278 +$as_echo_n "checking for _rl_caught_signal... " >&6; }
279 + cat confdefs.h - <<_ACEOF >conftest.$ac_ext
280 +/* end confdefs.h. */
282 -cat >>confdefs.h <<\_ACEOF
283 -#define readline_echoing_p _rl_echoing_p
287 +extern int volatile _rl_caught_signal;
288 + return _rl_caught_signal;
293 +if ac_fn_c_try_link "$LINENO"; then :
294 + READLINE_CAUGHT_SIGNAL=yes
296 +$as_echo "#define HAVE_READLINE_CAUGHT_SIGNAL /**/" >>confdefs.h
299 + READLINE_CAUGHT_SIGNAL=no
301 -rm -f conftest.err conftest.$ac_objext \
302 - conftest$ac_exeext conftest.$ac_ext
303 +rm -f core conftest.err conftest.$ac_objext \
304 + conftest$ac_exeext conftest.$ac_ext
305 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINE_CAUGHT_SIGNAL" >&5
306 +$as_echo "$READLINE_CAUGHT_SIGNAL" >&6; }
308 - echo "$as_me:$LINENO: result: $READLINE_ECHOING_P" >&5
309 -echo "${ECHO_T}$READLINE_ECHOING_P" >&6
311 READLINE='$(READLINE_DIR)/libreadline.a'
312 READLINE_DEPS='$(READLINE)'