diff --git a/gdb-bz594560-core-vs-process.patch b/gdb-bz594560-core-vs-process.patch new file mode 100644 index 0000000..5f7b9d4 --- /dev/null +++ b/gdb-bz594560-core-vs-process.patch @@ -0,0 +1,164 @@ +--- ./gdb/doc/gdb.texinfo 2010-05-24 19:37:01.000000000 +0200 ++++ ./gdb/doc/gdb.texinfo 2010-05-24 19:38:56.000000000 +0200 +@@ -14768,33 +14768,21 @@ and @code{show architecture}. + @cindex active targets + @cindex multiple targets + +-There are three classes of targets: processes, core files, and +-executable files. @value{GDBN} can work concurrently on up to three +-active targets, one in each class. This allows you to (for example) +-start a process and inspect its activity without abandoning your work on +-a core file. +- +-For example, if you execute @samp{gdb a.out}, then the executable file +-@code{a.out} is the only active target. If you designate a core file as +-well---presumably from a prior run that crashed and coredumped---then +-@value{GDBN} has two active targets and uses them in tandem, looking +-first in the corefile target, then in the executable file, to satisfy +-requests for memory addresses. (Typically, these two classes of target +-are complementary, since core files contain only a program's +-read-write memory---variables and so on---plus machine status, while +-executable files contain only the program text and initialized data.) +- +-When you type @code{run}, your executable file becomes an active process +-target as well. When a process target is active, all @value{GDBN} +-commands requesting memory addresses refer to that target; addresses in +-an active core file or executable file target are obscured while the +-process target is active. +- +-Use the @code{core-file} and @code{exec-file} commands to select a new +-core file or executable target (@pxref{Files, ,Commands to Specify +-Files}). To specify as a target a process that is already running, use +-the @code{attach} command (@pxref{Attach, ,Debugging an Already-running +-Process}). ++There are multiple classes of targets such as: processes, executable files or ++recording sessions. Core files belong to the process class, there can be ++active only one of a core or a running process. Otherwise @value{GDBN} can ++work concurrently on multiple active targets, one in each class. This allows ++you to (for example) start a process and inspect its activity while still ++having access to the executable file after the process finishes. Or if you ++start process recording (@pxref{Reverse Execution}) and @code{reverse-step} ++there you are presented a virtual layer of the recording target while the ++process target remains stopped at the chronologically last point of the process ++execution. ++ ++Use the @code{core-file} and @code{exec-file} commands to select a new core ++file or executable target (@pxref{Files, ,Commands to Specify Files}). To ++specify as a target a process that is already running, use the @code{attach} ++command (@pxref{Attach, ,Debugging an Already-running Process}). + + @node Target Commands + @section Commands for Managing Targets +--- ./gdb/infcmd.c 2010-05-24 19:37:01.000000000 +0200 ++++ ./gdb/infcmd.c 2010-05-24 19:41:21.000000000 +0200 +@@ -483,6 +483,13 @@ run_command_1 (char *args, int from_tty, + + dont_repeat (); + ++ if (core_bfd) ++ { ++ core_file_command (NULL, from_tty); ++ if (core_bfd) ++ warning (_("Core file not unloaded.")); ++ } ++ + kill_if_already_running (from_tty); + + init_wait_for_inferior (); +@@ -2373,6 +2380,13 @@ attach_command (char *args, int from_tty + error (_("Not killed.")); + } + ++ if (core_bfd) ++ { ++ core_file_command (NULL, from_tty); ++ if (core_bfd) ++ warning (_("Core file not unloaded.")); ++ } ++ + /* Clean up any leftovers from other runs. Some other things from + this function should probably be moved into target_pre_inferior. */ + target_pre_inferior (from_tty); +--- ./gdb/testsuite/gdb.base/corefile.exp 2010-01-09 01:14:11.000000000 +0100 ++++ ./gdb/testsuite/gdb.base/corefile.exp 2010-05-24 19:38:56.000000000 +0200 +@@ -182,3 +182,62 @@ gdb_load ${binfile} + gdb_test "up" "#\[0-9\]* *\[0-9xa-fH'\]* in .* \\(.*\\).*" "up in corefile.exp (reinit)" + + gdb_test "core" "No core file now." ++ ++ ++# Test a run (start) command will clear any loaded core file. ++ ++gdb_test "core-file $corefile" "Core was generated by .*" "run: load core again" ++gdb_test "info files" "\r\nLocal core dump file:\r\n.*" "run: sanity check we see the core file" ++ ++set test "run: with core" ++if [runto_main] { ++ pass $test ++} else { ++ fail $test ++} ++ ++set test "run: core file is cleared" ++gdb_test_multiple "info files" $test { ++ "\r\nLocal core dump file:\r\n.*\r\n$gdb_prompt $" { ++ fail $test ++ } ++ "\r\n$gdb_prompt $" { ++ pass $test ++ } ++} ++ ++gdb_exit ++ ++ ++# Test an attach command will clear any loaded core file. ++ ++if ![is_remote target] { ++ set test "attach: spawn sleep" ++ set res [remote_spawn host "$binfile sleep"]; ++ if { $res < 0 || $res == "" } { ++ perror "$test failed." ++ fail $test ++ return ++ } ++ set pid [exp_pid -i $res] ++ # We do not care of the startup phase where it will be caught. ++ ++ gdb_start ++ ++ gdb_test "core-file $corefile" "Core was generated by .*" "attach: load core again" ++ gdb_test "info files" "\r\nLocal core dump file:\r\n.*" "attach: sanity check we see the core file" ++ ++ gdb_test "attach $pid" "Attaching to process $pid\r\n.*" "attach: with core" ++ ++ set test "attach: core file is cleared" ++ gdb_test_multiple "info files" $test { ++ "\r\nLocal core dump file:\r\n.*\r\n$gdb_prompt $" { ++ fail $test ++ } ++ "\r\n$gdb_prompt $" { ++ pass $test ++ } ++ } ++ ++ gdb_exit ++} +--- ./gdb/testsuite/gdb.base/coremaker.c 2010-01-01 08:32:00.000000000 +0100 ++++ ./gdb/testsuite/gdb.base/coremaker.c 2010-05-24 19:38:56.000000000 +0200 +@@ -133,8 +133,14 @@ func1 () + func2 (); + } + +-int main () ++int ++main (int argc, char **argv) + { ++ if (argc == 2 && strcmp (argv[1], "sleep") == 0) ++ { ++ sleep (60); ++ return 0; ++ } + mmapdata (); + func1 (); + return 0; diff --git a/gdb-bz595475-tui-layout.patch b/gdb-bz595475-tui-layout.patch new file mode 100644 index 0000000..71742f8 --- /dev/null +++ b/gdb-bz595475-tui-layout.patch @@ -0,0 +1,79 @@ +https://bugzilla.redhat.com/show_bug.cgi?id=586566 +http://sourceware.org/ml/gdb-patches/2010-03/msg00746.html +http://sourceware.org/ml/gdb-patches/2010-05/msg00551.html +http://sourceware.org/ml/gdb-cvs/2010-03/msg00194.html + +### src/gdb/ChangeLog 2010/03/19 22:00:16 1.11508 +### src/gdb/ChangeLog 2010/03/20 05:17:10 1.11509 +## -1,3 +1,9 @@ ++2010-03-20 Daniel Jacobowitz ++ ++ * tui/tui-disasm.c (tui_get_begin_asm_address): Default to ++ get_current_arch. ++ * tui/tui-layout.c (extract_display_start_addr): Likewise. ++ + 2010-03-19 Stan Shebs + + * ax-gdb.c (gen_fetch): Handle bool. +--- src/gdb/tui/tui-disasm.c 2010/01/01 07:32:07 1.33 ++++ src/gdb/tui/tui-disasm.c 2010/03/20 05:17:10 1.34 +@@ -21,6 +21,7 @@ + along with this program. If not, see . */ + + #include "defs.h" ++#include "arch-utils.h" + #include "symtab.h" + #include "breakpoint.h" + #include "frame.h" +@@ -330,7 +331,7 @@ + { + struct tui_gen_win_info *locator; + struct tui_locator_element *element; +- struct gdbarch *gdbarch = NULL; ++ struct gdbarch *gdbarch = get_current_arch (); + CORE_ADDR addr; + + locator = tui_locator_win_info_ptr (); +--- src/gdb/tui/tui-layout.c 2010/01/01 07:32:07 1.36 ++++ src/gdb/tui/tui-layout.c 2010/03/20 05:17:10 1.37 +@@ -21,6 +21,7 @@ + along with this program. If not, see . */ + + #include "defs.h" ++#include "arch-utils.h" + #include "command.h" + #include "symtab.h" + #include "frame.h" +@@ -522,7 +523,7 @@ + extract_display_start_addr (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p) + { + enum tui_layout_type cur_layout = tui_current_layout (); +- struct gdbarch *gdbarch = NULL; ++ struct gdbarch *gdbarch = get_current_arch (); + CORE_ADDR addr; + CORE_ADDR pc; + struct symtab_and_line cursal = get_current_source_symtab_and_line (); +--- /dev/null 2010-05-24 04:43:32.632794021 +0200 ++++ gdb-7.1/gdb/testsuite/gdb.base/tui-layout.exp 2010-05-24 20:13:30.000000000 +0200 +@@ -0,0 +1,21 @@ ++# Copyright 2010 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 . ++ ++set testfile tui-layout ++if { [prepare_for_testing ${testfile}.exp ${testfile} start.c] } { ++ return -1 ++} ++ ++gdb_test "layout asm" diff --git a/gdb-upstream.patch b/gdb-upstream.patch index 57b2e72..8a4d076 100644 --- a/gdb-upstream.patch +++ b/gdb-upstream.patch @@ -822,3 +822,204 @@ commit 5e40af195bd74a66d300d8f481cab1f2ba533f3a { output[*nextp] = xstrdup (name); ++*nextp; + + + +https://bugzilla.redhat.com/show_bug.cgi?id=578136 +https://bugzilla.redhat.com/show_bug.cgi?id=593926 +http://sourceware.org/ml/gdb-patches/2010-04/msg00820.html +http://sourceware.org/ml/gdb-cvs/2010-04/msg00240.html + +### src/gdb/ChangeLog 2010/04/23 18:09:16 1.11678 +### src/gdb/ChangeLog 2010/04/23 21:44:19 1.11679 +## -1,3 +1,14 @@ ++2010-04-23 Daniel Jacobowitz ++ Paul Pluzhnikov ++ Jan Kratochvil ++ ++ Fix deadlock on looped list of loaded shared objects. ++ * solib-svr4.c (LM_PREV): New function. ++ (IGNORE_FIRST_LINK_MAP_ENTRY): Use it. ++ (svr4_current_sos): Check for correct l_prev. New variables prev_lm ++ and next_lm. Clear prev_lm for solib_svr4_r_ldsomap. ++ * config/djgpp/fnchange.lst: Add translation for solib-corrupted.exp. ++ + 2010-04-23 Doug Evans + + * configure.ac (CONFIG_SRCS): Add py-auto-load.o even if not using +--- src/gdb/solib-svr4.c 2010/03/11 22:07:02 1.130 ++++ src/gdb/solib-svr4.c 2010/04/23 21:44:19 1.131 +@@ -272,6 +272,16 @@ + } + + static CORE_ADDR ++LM_PREV (struct so_list *so) ++{ ++ struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); ++ struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr; ++ ++ return extract_typed_address (so->lm_info->lm + lmo->l_prev_offset, ++ ptr_type); ++} ++ ++static CORE_ADDR + LM_NAME (struct so_list *so) + { + struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); +@@ -284,16 +294,12 @@ + static int + IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so) + { +- struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); +- struct type *ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr; +- + /* Assume that everything is a library if the dynamic loader was loaded + late by a static executable. */ + if (exec_bfd && bfd_get_section_by_name (exec_bfd, ".dynamic") == NULL) + return 0; + +- return extract_typed_address (so->lm_info->lm + lmo->l_prev_offset, +- ptr_type) == 0; ++ return LM_PREV (so) == 0; + } + + /* Per pspace SVR4 specific data. */ +@@ -1101,7 +1107,7 @@ + static struct so_list * + svr4_current_sos (void) + { +- CORE_ADDR lm; ++ CORE_ADDR lm, prev_lm; + struct so_list *head = 0; + struct so_list **link_ptr = &head; + CORE_ADDR ldsomap = 0; +@@ -1120,6 +1126,7 @@ + + /* Walk the inferior's link map list, and build our list of + `struct so_list' nodes. */ ++ prev_lm = 0; + lm = solib_svr4_r_map (info); + + while (lm) +@@ -1127,6 +1134,7 @@ + struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); + struct so_list *new = XZALLOC (struct so_list); + struct cleanup *old_chain = make_cleanup (xfree, new); ++ CORE_ADDR next_lm; + + new->lm_info = xmalloc (sizeof (struct lm_info)); + make_cleanup (xfree, new->lm_info); +@@ -1138,14 +1146,21 @@ + + read_memory (lm, new->lm_info->lm, lmo->link_map_size); + +- lm = LM_NEXT (new); ++ next_lm = LM_NEXT (new); ++ ++ if (LM_PREV (new) != prev_lm) ++ { ++ warning (_("Corrupted shared library list")); ++ free_so (new); ++ next_lm = 0; ++ } + + /* For SVR4 versions, the first entry in the link map is for the + inferior executable, so we must ignore it. For some versions of + SVR4, it has no name. For others (Solaris 2.3 for example), it + does have a name, so we can no longer use a missing name to + decide when to ignore it. */ +- if (IGNORE_FIRST_LINK_MAP_ENTRY (new) && ldsomap == 0) ++ else if (IGNORE_FIRST_LINK_MAP_ENTRY (new) && ldsomap == 0) + { + info->main_lm_addr = new->lm_info->lm_addr; + free_so (new); +@@ -1182,12 +1197,18 @@ + } + } + ++ prev_lm = lm; ++ lm = next_lm; ++ + /* On Solaris, the dynamic linker is not in the normal list of + shared objects, so make sure we pick it up too. Having + symbol information for the dynamic linker is quite crucial + for skipping dynamic linker resolver code. */ + if (lm == 0 && ldsomap == 0) +- lm = ldsomap = solib_svr4_r_ldsomap (info); ++ { ++ lm = ldsomap = solib_svr4_r_ldsomap (info); ++ prev_lm = 0; ++ } + + discard_cleanups (old_chain); + } +--- src/gdb/config/djgpp/fnchange.lst 2010/04/09 15:15:05 1.112 ++++ src/gdb/config/djgpp/fnchange.lst 2010/04/23 21:44:19 1.113 +@@ -397,6 +397,7 @@ + @V@/gdb/testsuite/gdb.base/siginfo-obj.c @V@/gdb/testsuite/gdb.base/si-obj.c + @V@/gdb/testsuite/gdb.base/siginfo-addr.exp @V@/gdb/testsuite/gdb.base/si-addr.exp + @V@/gdb/testsuite/gdb.base/siginfo-obj.exp @V@/gdb/testsuite/gdb.base/si-obj.exp ++@V@/gdb/testsuite/gdb.base/solib-corrupted.exp @V@/gdb/testsuite/gdb.base/so-crptd.exp + @V@/gdb/testsuite/gdb.base/solib-disc.c @V@/gdb/testsuite/gdb.base/so-disc.c + @V@/gdb/testsuite/gdb.base/solib-display-lib.c @V@/gdb/testsuite/gdb.base/so-displib.c + @V@/gdb/testsuite/gdb.base/solib-display-main.c @V@/gdb/testsuite/gdb.base/so-dispmain.c +### src/gdb/testsuite/ChangeLog 2010/04/23 18:03:31 1.2252 +### src/gdb/testsuite/ChangeLog 2010/04/23 21:44:20 1.2253 +## -1,3 +1,8 @@ ++2010-04-23 Jan Kratochvil ++ ++ Fix deadlock on looped list of loaded shared objects. ++ * gdb.base/solib-corrupted.exp: New. ++ + 2010-04-23 Doug Evans + + * gdb.python/py-section-script.c: New file. +--- src/gdb/testsuite/gdb.base/solib-corrupted.exp ++++ src/gdb/testsuite/gdb.base/solib-corrupted.exp 2010-05-24 18:00:52.057995000 +0000 +@@ -0,0 +1,46 @@ ++# Copyright 2010 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 . ++ ++set testfile "solib-corrupted" ++set srcfile start.c ++ ++if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { ++ untested ${testfile}.exp ++ return -1 ++} ++ ++if ![runto_main] { ++ fail "Can't run to main" ++ return ++} ++ ++gdb_test "info sharedlibrary" "" "normal list" ++ ++# GDB checks there for matching L_PREV. ++set test "make solibs looping" ++gdb_test_multiple "p/x _r_debug->r_map->l_next = _r_debug->r_map" $test { ++ -re "(No symbol \"_r_debug\" in current context\\.|Attempt to extract a component of a value that is not a structure pointer\\.)\r\n$gdb_prompt $" { ++ # glibc debug info is not available and it is too difficult to find and ++ # parse it from this testcase without the gdb supporting functions. ++ verbose -log "no _r_debug symbol has been found" ++ xfail $test ++ untested ${testfile}.exp ++ return ++ } ++ -re " = 0x\[0-9a-f\]+\r\n$gdb_prompt $" { ++ pass $test ++ } ++} ++gdb_test "info sharedlibrary" "warning: Corrupted shared library list\r\n.*" "corrupted list" diff --git a/gdb.spec b/gdb.spec index ae86126..dc8f132 100644 --- a/gdb.spec +++ b/gdb.spec @@ -36,7 +36,7 @@ Version: 7.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: 21%{?_with_upstream:.upstream}%{dist} +Release: 22%{?_with_upstream:.upstream}%{dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and GFDL and BSD and Public Domain Group: Development/Debuggers @@ -480,6 +480,12 @@ Patch459: gdb-moribund-utrace-workaround.patch # Fix crash on VLA bound referencing an optimized-out variable (BZ 591879). Patch460: gdb-archer-vla-ref-optimizedout.patch +# Remove core file when starting a process (BZ 594560). +Patch461: gdb-bz594560-core-vs-process.patch + +# Import fix of TUI layout internal error (BZ 595475). +Patch462: gdb-bz595475-tui-layout.patch + BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa} Requires: readline%{?_isa} BuildRequires: readline-devel%{?_isa} @@ -755,6 +761,8 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch458 -p1 %patch459 -p1 %patch460 -p1 +%patch461 -p1 +%patch462 -p1 %patch415 -p1 %patch393 -p1 @@ -1087,6 +1095,11 @@ fi %endif %changelog +* Mon May 24 2010 Jan Kratochvil - 7.1-22.fc13 +- Remove core file when starting a process (BZ 594560). +- Fix lock up on loops in the solib chain (BZ 593926). +- Import fix of TUI layout internal error (BZ 595475). + * Sun May 16 2010 Jan Kratochvil - 7.1-21.fc13 - Make gdb-6.8-bz254229-gcore-prpsinfo.patch RHEL-5 /usr/bin/patch compatible (bugreported by Jonas Maebe).