Rebase to FSF GDB 7.7.90.20140627 (pre-7.8 snapshot).
This commit is contained in:
parent
dd2c5ed0e6
commit
de9f421a3c
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +1,2 @@
|
|||||||
/gdb-libstdc++-v3-python-r155978.tar.bz2
|
/gdb-libstdc++-v3-python-r155978.tar.bz2
|
||||||
/gdb-7.7.90.20140613.tar.bz2
|
/gdb-7.7.90.20140627.tar.bz2
|
||||||
|
@ -1,207 +0,0 @@
|
|||||||
Re: ASAN crash regression [Re: [PATCH 2/2] move the demangled_names_hash into the per-BFD]
|
|
||||||
https://sourceware.org/ml/gdb-patches/2014-06/msg00550.html
|
|
||||||
|
|
||||||
Jan> ./configure ... -fsanitize=address
|
|
||||||
Jan> echo 'void f(){}main(){}'|gcc -x c++ - -g;ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer ./gdb -batch a.out -ex 'file a.out'
|
|
||||||
|
|
||||||
Readily seen with valgrind as well.
|
|
||||||
|
|
||||||
Here's my proposed fix.
|
|
||||||
|
|
||||||
Tom
|
|
||||||
|
|
||||||
commit 3a93a67ad0ea3495f67c9708673345b73de2d806
|
|
||||||
Author: Tom Tromey <tromey@redhat.com>
|
|
||||||
Date: Mon Jun 16 03:17:19 2014 -0600
|
|
||||||
|
|
||||||
fix memory errors with demangled name hash
|
|
||||||
|
|
||||||
This fixes a regression that Jan pointed out.
|
|
||||||
|
|
||||||
The bug is that some names were allocated by dwarf2read on the objfile
|
|
||||||
obstack, but then passed to SYMBOL_SET_NAMES with copy_name=0. This
|
|
||||||
violates the invariant that the names must have a lifetime tied to the
|
|
||||||
lifetime of the BFD.
|
|
||||||
|
|
||||||
The fix is to allocate names on the per-BFD obstack.
|
|
||||||
|
|
||||||
I looked at all callers, direct or indirect, of SYMBOL_SET_NAMES that
|
|
||||||
pass copy_name=0. Note that only the ELF and DWARF readers do this;
|
|
||||||
other symbol readers were never updated (and perhaps cannot be,
|
|
||||||
depending on the details of the formats). This is why the patch is
|
|
||||||
relatively small.
|
|
||||||
|
|
||||||
Built and regtested on x86-64 Fedora 20.
|
|
||||||
|
|
||||||
2014-06-16 Tom Tromey <tromey@redhat.com>
|
|
||||||
|
|
||||||
* dwarf2read.c (fixup_go_packaging, dwarf2_compute_name)
|
|
||||||
(dwarf2_physname, read_partial_die)
|
|
||||||
(guess_partial_die_structure_name, fixup_partial_die)
|
|
||||||
(guess_full_die_structure_name, anonymous_struct_prefix)
|
|
||||||
(dwarf2_name): Use per-BFD obstack.
|
|
||||||
|
|
||||||
### a/gdb/ChangeLog
|
|
||||||
### b/gdb/ChangeLog
|
|
||||||
## -1,5 +1,13 @@
|
|
||||||
2014-06-16 Tom Tromey <tromey@redhat.com>
|
|
||||||
|
|
||||||
+ * dwarf2read.c (fixup_go_packaging, dwarf2_compute_name)
|
|
||||||
+ (dwarf2_physname, read_partial_die)
|
|
||||||
+ (guess_partial_die_structure_name, fixup_partial_die)
|
|
||||||
+ (guess_full_die_structure_name, anonymous_struct_prefix)
|
|
||||||
+ (dwarf2_name): Use per-BFD obstack.
|
|
||||||
+
|
|
||||||
+2014-06-16 Tom Tromey <tromey@redhat.com>
|
|
||||||
+
|
|
||||||
* minsyms.h (prim_record_minimal_symbol)
|
|
||||||
(prim_record_minimal_symbol_and_info): Update comments.
|
|
||||||
|
|
||||||
--- a/gdb/dwarf2read.c
|
|
||||||
+++ b/gdb/dwarf2read.c
|
|
||||||
@@ -7745,9 +7745,10 @@ fixup_go_packaging (struct dwarf2_cu *cu)
|
|
||||||
if (package_name != NULL)
|
|
||||||
{
|
|
||||||
struct objfile *objfile = cu->objfile;
|
|
||||||
- const char *saved_package_name = obstack_copy0 (&objfile->objfile_obstack,
|
|
||||||
- package_name,
|
|
||||||
- strlen (package_name));
|
|
||||||
+ const char *saved_package_name
|
|
||||||
+ = obstack_copy0 (&objfile->per_bfd->storage_obstack,
|
|
||||||
+ package_name,
|
|
||||||
+ strlen (package_name));
|
|
||||||
struct type *type = init_type (TYPE_CODE_MODULE, 0, 0,
|
|
||||||
saved_package_name, objfile);
|
|
||||||
struct symbol *sym;
|
|
||||||
@@ -8365,6 +8366,8 @@ dwarf2_compute_name (const char *name,
|
|
||||||
long length;
|
|
||||||
const char *prefix;
|
|
||||||
struct ui_file *buf;
|
|
||||||
+ char *intermediate_name;
|
|
||||||
+ const char *canonical_name = NULL;
|
|
||||||
|
|
||||||
prefix = determine_prefix (die, cu);
|
|
||||||
buf = mem_fileopen ();
|
|
||||||
@@ -8541,19 +8544,25 @@ dwarf2_compute_name (const char *name,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- name = ui_file_obsavestring (buf, &objfile->objfile_obstack,
|
|
||||||
- &length);
|
|
||||||
+ intermediate_name = ui_file_xstrdup (buf, &length);
|
|
||||||
ui_file_delete (buf);
|
|
||||||
|
|
||||||
if (cu->language == language_cplus)
|
|
||||||
- {
|
|
||||||
- const char *cname
|
|
||||||
- = dwarf2_canonicalize_name (name, cu,
|
|
||||||
- &objfile->objfile_obstack);
|
|
||||||
+ canonical_name
|
|
||||||
+ = dwarf2_canonicalize_name (intermediate_name, cu,
|
|
||||||
+ &objfile->per_bfd->storage_obstack);
|
|
||||||
+
|
|
||||||
+ /* If we only computed INTERMEDIATE_NAME, or if
|
|
||||||
+ INTERMEDIATE_NAME is already canonical, then we need to
|
|
||||||
+ copy it to the appropriate obstack. */
|
|
||||||
+ if (canonical_name == NULL || canonical_name == intermediate_name)
|
|
||||||
+ name = obstack_copy0 (&objfile->per_bfd->storage_obstack,
|
|
||||||
+ intermediate_name,
|
|
||||||
+ strlen (intermediate_name));
|
|
||||||
+ else
|
|
||||||
+ name = canonical_name;
|
|
||||||
|
|
||||||
- if (cname != NULL)
|
|
||||||
- name = cname;
|
|
||||||
- }
|
|
||||||
+ xfree (intermediate_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -8562,7 +8571,7 @@ dwarf2_compute_name (const char *name,
|
|
||||||
|
|
||||||
/* Return the fully qualified name of DIE, based on its DW_AT_name.
|
|
||||||
If scope qualifiers are appropriate they will be added. The result
|
|
||||||
- will be allocated on the objfile_obstack, or NULL if the DIE does
|
|
||||||
+ will be allocated on the storage_obstack, or NULL if the DIE does
|
|
||||||
not have a name. NAME may either be from a previous call to
|
|
||||||
dwarf2_name or NULL.
|
|
||||||
|
|
||||||
@@ -8677,7 +8686,8 @@ dwarf2_physname (const char *name, struct die_info *die, struct dwarf2_cu *cu)
|
|
||||||
retval = canon;
|
|
||||||
|
|
||||||
if (need_copy)
|
|
||||||
- retval = obstack_copy0 (&objfile->objfile_obstack, retval, strlen (retval));
|
|
||||||
+ retval = obstack_copy0 (&objfile->per_bfd->storage_obstack,
|
|
||||||
+ retval, strlen (retval));
|
|
||||||
|
|
||||||
do_cleanups (back_to);
|
|
||||||
return retval;
|
|
||||||
@@ -15508,7 +15518,7 @@ read_partial_die (const struct die_reader_specs *reader,
|
|
||||||
default:
|
|
||||||
part_die->name
|
|
||||||
= dwarf2_canonicalize_name (DW_STRING (&attr), cu,
|
|
||||||
- &objfile->objfile_obstack);
|
|
||||||
+ &objfile->per_bfd->storage_obstack);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
@@ -15793,7 +15803,7 @@ guess_partial_die_structure_name (struct partial_die_info *struct_pdi,
|
|
||||||
if (actual_class_name != NULL)
|
|
||||||
{
|
|
||||||
struct_pdi->name
|
|
||||||
- = obstack_copy0 (&cu->objfile->objfile_obstack,
|
|
||||||
+ = obstack_copy0 (&cu->objfile->per_bfd->storage_obstack,
|
|
||||||
actual_class_name,
|
|
||||||
strlen (actual_class_name));
|
|
||||||
xfree (actual_class_name);
|
|
||||||
@@ -15879,8 +15889,9 @@ fixup_partial_die (struct partial_die_info *part_die,
|
|
||||||
else
|
|
||||||
base = demangled;
|
|
||||||
|
|
||||||
- part_die->name = obstack_copy0 (&cu->objfile->objfile_obstack,
|
|
||||||
- base, strlen (base));
|
|
||||||
+ part_die->name
|
|
||||||
+ = obstack_copy0 (&cu->objfile->per_bfd->storage_obstack,
|
|
||||||
+ base, strlen (base));
|
|
||||||
xfree (demangled);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -18557,7 +18568,7 @@ guess_full_die_structure_name (struct die_info *die, struct dwarf2_cu *cu)
|
|
||||||
&& actual_name[actual_name_len
|
|
||||||
- die_name_len - 1] == ':')
|
|
||||||
name =
|
|
||||||
- obstack_copy0 (&cu->objfile->objfile_obstack,
|
|
||||||
+ obstack_copy0 (&cu->objfile->per_bfd->storage_obstack,
|
|
||||||
actual_name,
|
|
||||||
actual_name_len - die_name_len - 2);
|
|
||||||
}
|
|
||||||
@@ -18603,7 +18614,7 @@ anonymous_struct_prefix (struct die_info *die, struct dwarf2_cu *cu)
|
|
||||||
if (base == NULL || base == DW_STRING (attr) || base[-1] != ':')
|
|
||||||
return "";
|
|
||||||
|
|
||||||
- return obstack_copy0 (&cu->objfile->objfile_obstack,
|
|
||||||
+ return obstack_copy0 (&cu->objfile->per_bfd->storage_obstack,
|
|
||||||
DW_STRING (attr), &base[-1] - DW_STRING (attr));
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -18943,8 +18954,9 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
|
|
||||||
char *base;
|
|
||||||
|
|
||||||
/* FIXME: we already did this for the partial symbol... */
|
|
||||||
- DW_STRING (attr) = obstack_copy0 (&cu->objfile->objfile_obstack,
|
|
||||||
- demangled, strlen (demangled));
|
|
||||||
+ DW_STRING (attr)
|
|
||||||
+ = obstack_copy0 (&cu->objfile->per_bfd->storage_obstack,
|
|
||||||
+ demangled, strlen (demangled));
|
|
||||||
DW_STRING_IS_CANONICAL (attr) = 1;
|
|
||||||
xfree (demangled);
|
|
||||||
|
|
||||||
@@ -18967,7 +18979,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
|
|
||||||
{
|
|
||||||
DW_STRING (attr)
|
|
||||||
= dwarf2_canonicalize_name (DW_STRING (attr), cu,
|
|
||||||
- &cu->objfile->objfile_obstack);
|
|
||||||
+ &cu->objfile->per_bfd->storage_obstack);
|
|
||||||
DW_STRING_IS_CANONICAL (attr) = 1;
|
|
||||||
}
|
|
||||||
return DW_STRING (attr);
|
|
@ -1,321 +0,0 @@
|
|||||||
http://sourceware.org/ml/gdb-patches/2014-06/msg00656.html
|
|
||||||
Subject: Re: Regression with default scheduler-locking=step [Re: [pushed] Consecutive step-overs trigger internal error.]
|
|
||||||
|
|
||||||
On 06/17/2014 08:24 PM, Jan Kratochvil wrote:
|
|
||||||
> On Tue, 22 Apr 2014 20:24:28 +0200, Pedro Alves wrote:
|
|
||||||
>> Tested on x86_64 Fedora 17, native and gdbserver, and also native on
|
|
||||||
>> top of my "software single-step on x86_64" series.
|
|
||||||
>
|
|
||||||
> 483805cf9ea5a6dace41415d8830e93fccc49c43 is the first bad commit
|
|
||||||
> commit 483805cf9ea5a6dace41415d8830e93fccc49c43
|
|
||||||
> Author: Pedro Alves <palves@redhat.com>
|
|
||||||
> Date: Tue Apr 22 15:00:56 2014 +0100
|
|
||||||
> Consecutive step-overs trigger internal error.
|
|
||||||
>
|
|
||||||
> (gdb) next^M
|
|
||||||
> [Thread 0x7ffff7fda700 (LWP 27168) exited]^M
|
|
||||||
> [New LWP 27168]^M
|
|
||||||
> [Thread 0x7ffff74ee700 (LWP 27174) exited]^M
|
|
||||||
> process 27168 is executing new program: /home/jkratoch/redhat/gdb-clean/gdb/testsuite/gdb.threads/thread-execl^M
|
|
||||||
> [Thread debugging using libthread_db enabled]^M
|
|
||||||
> Using host libthread_db library "/lib64/libthread_db.so.1".^M
|
|
||||||
> infrun.c:5225: internal-error: switch_back_to_stepped_thread: Assertion `!schedlock_applies (1)' failed.^M
|
|
||||||
> A problem internal to GDB has been detected,^M
|
|
||||||
> further debugging may prove unreliable.^M
|
|
||||||
> Quit this debugging session? (y or n) FAIL: gdb.threads/thread-execl.exp: get to main in new image (GDB internal error)
|
|
||||||
> Resyncing due to internal error.
|
|
||||||
|
|
||||||
Thanks Jan.
|
|
||||||
|
|
||||||
>
|
|
||||||
> The regressions happens only with the attached patch which I am not sure if it
|
|
||||||
> is considered as a valid FSF GDB regression or not but I think it is.
|
|
||||||
|
|
||||||
If it worked before, then it's certainly a regression. The user is
|
|
||||||
free to do "set scheduler-locking step" herself.
|
|
||||||
|
|
||||||
Here's a fix. Let me know what you think.
|
|
||||||
|
|
||||||
8<---------------------------------
|
|
||||||
>From f717378c16cb04f8350935a1336767d2541b36a5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Pedro Alves <palves@redhat.com>
|
|
||||||
Date: Wed, 18 Jun 2014 14:20:31 +0100
|
|
||||||
Subject: [PATCH] Fix next over threaded execl with "set scheduler-locking
|
|
||||||
Subject: [PATCH] Fix next over threaded execl with "set scheduler-locking
|
|
||||||
step".
|
|
||||||
|
|
||||||
Running gdb.threads/thread-execl.exp with scheduler-locking set to
|
|
||||||
"step" reveals a problem:
|
|
||||||
|
|
||||||
(gdb) next^M
|
|
||||||
[Thread 0x7ffff7fda700 (LWP 27168) exited]^M
|
|
||||||
[New LWP 27168]^M
|
|
||||||
[Thread 0x7ffff74ee700 (LWP 27174) exited]^M
|
|
||||||
process 27168 is executing new program: /home/jkratoch/redhat/gdb-clean/gdb/testsuite/gdb.threads/thread-execl^M
|
|
||||||
[Thread debugging using libthread_db enabled]^M
|
|
||||||
Using host libthread_db library "/lib64/libthread_db.so.1".^M
|
|
||||||
infrun.c:5225: internal-error: switch_back_to_stepped_thread: Assertion `!schedlock_applies (1)' failed.^M
|
|
||||||
A problem internal to GDB has been detected,^M
|
|
||||||
further debugging may prove unreliable.^M
|
|
||||||
Quit this debugging session? (y or n) FAIL: gdb.threads/thread-execl.exp: schedlock step: get to main in new image (GDB internal error)
|
|
||||||
|
|
||||||
The assertion is correct. The issue is that GDB is mistakenly trying
|
|
||||||
to switch back to an exited thread, that was previously stepping when
|
|
||||||
it exited. This is exactly the sort of thing the test wants to make
|
|
||||||
sure doesn't happen:
|
|
||||||
|
|
||||||
# Now set a breakpoint at `main', and step over the execl call. The
|
|
||||||
# breakpoint at main should be reached. GDB should not try to revert
|
|
||||||
# back to the old thread from the old image and resume stepping it
|
|
||||||
|
|
||||||
We don't see this bug with schedlock off only because a different
|
|
||||||
sequence of events makes GDB manage to delete the thread instead of
|
|
||||||
marking it exited.
|
|
||||||
|
|
||||||
This particular internal error can be fixed by making the loop over
|
|
||||||
all threads in switch_back_to_stepped_thread skip exited threads.
|
|
||||||
But, looking over other ALL_THREADS users, all either can or should be
|
|
||||||
skipping exited threads too. So for simplicity, this patch replaces
|
|
||||||
ALL_THREADS with a new macro that skips exited threads itself, and
|
|
||||||
updates everything to use it.
|
|
||||||
|
|
||||||
Tested on x86_64 Fedora 20.
|
|
||||||
|
|
||||||
gdb/
|
|
||||||
2014-06-18 Pedro Alves <palves@redhat.com>
|
|
||||||
|
|
||||||
* gdbthread.h (ALL_THREADS): Delete.
|
|
||||||
(ALL_NON_EXITED_THREADS): New macro.
|
|
||||||
* btrace.c (btrace_free_objfile): Use ALL_NON_EXITED_THREADS
|
|
||||||
instead of ALL_THREADS.
|
|
||||||
* infrun.c (find_thread_needs_step_over)
|
|
||||||
(switch_back_to_stepped_thread): Use ALL_NON_EXITED_THREADS
|
|
||||||
instead of ALL_THREADS.
|
|
||||||
* record-btrace.c (record_btrace_open)
|
|
||||||
(record_btrace_stop_recording, record_btrace_close)
|
|
||||||
(record_btrace_is_replaying, record_btrace_resume)
|
|
||||||
(record_btrace_find_thread_to_move, record_btrace_wait): Likewise.
|
|
||||||
* remote.c (append_pending_thread_resumptions): Likewise.
|
|
||||||
|
|
||||||
gdb/testsuite/
|
|
||||||
2014-06-18 Pedro Alves <palves@redhat.com>
|
|
||||||
|
|
||||||
* gdb.threads/thread-execl.exp (do_test): New procedure, factored
|
|
||||||
out from ...
|
|
||||||
(top level): ... here. Iterate running tests under different
|
|
||||||
scheduler-locking settings.
|
|
||||||
---
|
|
||||||
gdb/btrace.c | 2 +-
|
|
||||||
gdb/gdbthread.h | 8 ++++--
|
|
||||||
gdb/infrun.c | 4 +--
|
|
||||||
gdb/record-btrace.c | 14 +++++-----
|
|
||||||
gdb/remote.c | 2 +-
|
|
||||||
gdb/testsuite/gdb.threads/thread-execl.exp | 44 ++++++++++++++++++++----------
|
|
||||||
gdb/thread.c | 2 +-
|
|
||||||
7 files changed, 46 insertions(+), 30 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gdb/btrace.c b/gdb/btrace.c
|
|
||||||
index 601eb41..87a171e 100644
|
|
||||||
--- a/gdb/btrace.c
|
|
||||||
+++ b/gdb/btrace.c
|
|
||||||
@@ -958,7 +958,7 @@ btrace_free_objfile (struct objfile *objfile)
|
|
||||||
|
|
||||||
DEBUG ("free objfile");
|
|
||||||
|
|
||||||
- ALL_THREADS (tp)
|
|
||||||
+ ALL_NON_EXITED_THREADS (tp)
|
|
||||||
btrace_clear (tp);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h
|
|
||||||
index 9f5dee6..64e37c3 100644
|
|
||||||
--- a/gdb/gdbthread.h
|
|
||||||
+++ b/gdb/gdbthread.h
|
|
||||||
@@ -317,10 +317,12 @@ void thread_change_ptid (ptid_t old_ptid, ptid_t new_ptid);
|
|
||||||
typedef int (*thread_callback_func) (struct thread_info *, void *);
|
|
||||||
extern struct thread_info *iterate_over_threads (thread_callback_func, void *);
|
|
||||||
|
|
||||||
-/* Traverse all threads. */
|
|
||||||
+/* Traverse all threads, except those that have THREAD_EXITED
|
|
||||||
+ state. */
|
|
||||||
|
|
||||||
-#define ALL_THREADS(T) \
|
|
||||||
- for (T = thread_list; T; T = T->next)
|
|
||||||
+#define ALL_NON_EXITED_THREADS(T) \
|
|
||||||
+ for (T = thread_list; T; T = T->next) \
|
|
||||||
+ if ((T)->state != THREAD_EXITED)
|
|
||||||
|
|
||||||
extern int thread_count (void);
|
|
||||||
|
|
||||||
diff --git a/gdb/infrun.c b/gdb/infrun.c
|
|
||||||
index 4e808d9..e8e26e0 100644
|
|
||||||
--- a/gdb/infrun.c
|
|
||||||
+++ b/gdb/infrun.c
|
|
||||||
@@ -2160,7 +2160,7 @@ find_thread_needs_step_over (int step, struct thread_info *except)
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ALL_THREADS (tp)
|
|
||||||
+ ALL_NON_EXITED_THREADS (tp)
|
|
||||||
{
|
|
||||||
/* Ignore the EXCEPT thread. */
|
|
||||||
if (tp == except)
|
|
||||||
@@ -5204,7 +5204,7 @@ switch_back_to_stepped_thread (struct execution_control_state *ecs)
|
|
||||||
step/next/etc. */
|
|
||||||
stepping_thread = NULL;
|
|
||||||
step_over = NULL;
|
|
||||||
- ALL_THREADS (tp)
|
|
||||||
+ ALL_NON_EXITED_THREADS (tp)
|
|
||||||
{
|
|
||||||
/* Ignore threads of processes we're not resuming. */
|
|
||||||
if (!sched_multi
|
|
||||||
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
|
|
||||||
index e0c537a8..6a9bfe1 100644
|
|
||||||
--- a/gdb/record-btrace.c
|
|
||||||
+++ b/gdb/record-btrace.c
|
|
||||||
@@ -206,7 +206,7 @@ record_btrace_open (char *args, int from_tty)
|
|
||||||
gdb_assert (record_btrace_thread_observer == NULL);
|
|
||||||
|
|
||||||
disable_chain = make_cleanup (null_cleanup, NULL);
|
|
||||||
- ALL_THREADS (tp)
|
|
||||||
+ ALL_NON_EXITED_THREADS (tp)
|
|
||||||
if (args == NULL || *args == 0 || number_is_in_list (args, tp->num))
|
|
||||||
{
|
|
||||||
btrace_enable (tp);
|
|
||||||
@@ -238,7 +238,7 @@ record_btrace_stop_recording (struct target_ops *self)
|
|
||||||
|
|
||||||
record_btrace_auto_disable ();
|
|
||||||
|
|
||||||
- ALL_THREADS (tp)
|
|
||||||
+ ALL_NON_EXITED_THREADS (tp)
|
|
||||||
if (tp->btrace.target != NULL)
|
|
||||||
btrace_disable (tp);
|
|
||||||
}
|
|
||||||
@@ -259,7 +259,7 @@ record_btrace_close (struct target_ops *self)
|
|
||||||
|
|
||||||
/* We should have already stopped recording.
|
|
||||||
Tear down btrace in case we have not. */
|
|
||||||
- ALL_THREADS (tp)
|
|
||||||
+ ALL_NON_EXITED_THREADS (tp)
|
|
||||||
btrace_teardown (tp);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -835,7 +835,7 @@ record_btrace_is_replaying (struct target_ops *self)
|
|
||||||
{
|
|
||||||
struct thread_info *tp;
|
|
||||||
|
|
||||||
- ALL_THREADS (tp)
|
|
||||||
+ ALL_NON_EXITED_THREADS (tp)
|
|
||||||
if (btrace_is_replaying (tp))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
@@ -1522,7 +1522,7 @@ record_btrace_resume (struct target_ops *ops, ptid_t ptid, int step,
|
|
||||||
|
|
||||||
/* Stop replaying other threads if the thread to resume is not replaying. */
|
|
||||||
if (!btrace_is_replaying (tp) && execution_direction != EXEC_REVERSE)
|
|
||||||
- ALL_THREADS (other)
|
|
||||||
+ ALL_NON_EXITED_THREADS (other)
|
|
||||||
record_btrace_stop_replaying (other);
|
|
||||||
|
|
||||||
/* As long as we're not replaying, just forward the request. */
|
|
||||||
@@ -1572,7 +1572,7 @@ record_btrace_find_thread_to_move (ptid_t ptid)
|
|
||||||
return tp;
|
|
||||||
|
|
||||||
/* Otherwise, find one other thread that has been resumed. */
|
|
||||||
- ALL_THREADS (tp)
|
|
||||||
+ ALL_NON_EXITED_THREADS (tp)
|
|
||||||
if ((tp->btrace.flags & BTHR_MOVE) != 0)
|
|
||||||
return tp;
|
|
||||||
|
|
||||||
@@ -1777,7 +1777,7 @@ record_btrace_wait (struct target_ops *ops, ptid_t ptid,
|
|
||||||
|
|
||||||
/* Stop all other threads. */
|
|
||||||
if (!non_stop)
|
|
||||||
- ALL_THREADS (other)
|
|
||||||
+ ALL_NON_EXITED_THREADS (other)
|
|
||||||
other->btrace.flags &= ~BTHR_MOVE;
|
|
||||||
|
|
||||||
/* Start record histories anew from the current position. */
|
|
||||||
diff --git a/gdb/remote.c b/gdb/remote.c
|
|
||||||
index 6915dd8..b5318f1 100644
|
|
||||||
--- a/gdb/remote.c
|
|
||||||
+++ b/gdb/remote.c
|
|
||||||
@@ -4626,7 +4626,7 @@ append_pending_thread_resumptions (char *p, char *endp, ptid_t ptid)
|
|
||||||
{
|
|
||||||
struct thread_info *thread;
|
|
||||||
|
|
||||||
- ALL_THREADS (thread)
|
|
||||||
+ ALL_NON_EXITED_THREADS (thread)
|
|
||||||
if (ptid_match (thread->ptid, ptid)
|
|
||||||
&& !ptid_equal (inferior_ptid, thread->ptid)
|
|
||||||
&& thread->suspend.stop_signal != GDB_SIGNAL_0
|
|
||||||
diff --git a/gdb/testsuite/gdb.threads/thread-execl.exp b/gdb/testsuite/gdb.threads/thread-execl.exp
|
|
||||||
index d837fe4..14b96d2 100644
|
|
||||||
--- a/gdb/testsuite/gdb.threads/thread-execl.exp
|
|
||||||
+++ b/gdb/testsuite/gdb.threads/thread-execl.exp
|
|
||||||
@@ -28,19 +28,33 @@ if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
-clean_restart ${binfile}
|
|
||||||
-
|
|
||||||
-runto_main
|
|
||||||
-
|
|
||||||
-# Get ourselves to the thread that execs
|
|
||||||
-gdb_breakpoint "thread_execler"
|
|
||||||
-gdb_test "continue" ".*thread_execler.*" "continue to thread start"
|
|
||||||
-
|
|
||||||
-# Now set a breakpoint at `main', and step over the execl call. The
|
|
||||||
-# breakpoint at main should be reached. GDB should not try to revert
|
|
||||||
-# back to the old thread from the old image and resume stepping it
|
|
||||||
-# (since it is gone).
|
|
||||||
-gdb_breakpoint "main"
|
|
||||||
-gdb_test "next" ".*main.*" "get to main in new image"
|
|
||||||
+# Run the test proper. SCHEDLOCK specifies what scheduler-locking
|
|
||||||
+# should be set to.
|
|
||||||
+
|
|
||||||
+proc do_test { schedlock } {
|
|
||||||
+ global binfile
|
|
||||||
+
|
|
||||||
+ with_test_prefix "schedlock $schedlock" {
|
|
||||||
+ clean_restart ${binfile}
|
|
||||||
+
|
|
||||||
+ if ![runto_main] {
|
|
||||||
+ return 0
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ # Get ourselves to the thread that execs.
|
|
||||||
+ gdb_breakpoint "thread_execler"
|
|
||||||
+ gdb_test "continue" ".*thread_execler.*" "continue to thread start"
|
|
||||||
+
|
|
||||||
+ # Now set a breakpoint at `main', and step over the execl call. The
|
|
||||||
+ # breakpoint at main should be reached. GDB should not try to revert
|
|
||||||
+ # back to the old thread from the old image and resume stepping it
|
|
||||||
+ # (since it is gone).
|
|
||||||
+ gdb_breakpoint "main"
|
|
||||||
+ gdb_test_no_output "set scheduler-locking $schedlock"
|
|
||||||
+ gdb_test "next" ".*main.*" "get to main in new image"
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
|
|
||||||
-return 0
|
|
||||||
+foreach schedlock {"off" "step" "on"} {
|
|
||||||
+ do_test $schedlock
|
|
||||||
+}
|
|
||||||
diff --git a/gdb/thread.c b/gdb/thread.c
|
|
||||||
index 7bc5271..532149d 100644
|
|
||||||
--- a/gdb/thread.c
|
|
||||||
+++ b/gdb/thread.c
|
|
||||||
@@ -1243,7 +1243,7 @@ thread_apply_all_command (char *cmd, int from_tty)
|
|
||||||
ta_cleanup.tp_array = tp_array;
|
|
||||||
ta_cleanup.count = tc;
|
|
||||||
|
|
||||||
- ALL_THREADS (tp)
|
|
||||||
+ ALL_NON_EXITED_THREADS (tp)
|
|
||||||
{
|
|
||||||
tp_array[i] = tp;
|
|
||||||
tp->refcount++;
|
|
||||||
--
|
|
||||||
1.9.3
|
|
||||||
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
|||||||
http://sourceware.org/ml/gdb-patches/2014-06/msg00710.html
|
|
||||||
Subject: Re: Regression for watchpoint-fork.exp [Re: [PATCH v3 2/5] PR breakpoints/7143 - Watchpoint does not trigger when first set]
|
|
||||||
|
|
||||||
On 06/19/2014 04:02 PM, Pedro Alves wrote:
|
|
||||||
|
|
||||||
>> Attaching gzipped gdb.threads/watchpoint-fork-parent-st
|
|
||||||
>> from gcc-4.9.0-9.fc21.x86_64.
|
|
||||||
>
|
|
||||||
> Thanks, I can reproduce it.
|
|
||||||
|
|
||||||
Hmm, I suspect this might be related to kernel-side validation
|
|
||||||
of DR_CONTROL vs DR0-3, like what we already handle in amd64_linux_prepare_to_resume.
|
|
||||||
And indeed this below makes the error go away. Not exactly sure why yet.
|
|
||||||
|
|
||||||
[ patch extended by Jan Kratochvil ]
|
|
||||||
|
|
||||||
--- gdb-7.7.90.20140613/gdb/i386-linux-nat.c.orig 2014-06-19 21:42:00.788611544 +0200
|
|
||||||
+++ gdb-7.7.90.20140613/gdb/i386-linux-nat.c 2014-06-19 21:42:04.556614401 +0200
|
|
||||||
@@ -778,6 +778,8 @@ i386_linux_prepare_to_resume (struct lwp
|
|
||||||
/* See amd64_linux_prepare_to_resume for Linux kernel note on
|
|
||||||
i386_linux_dr_set calls ordering. */
|
|
||||||
|
|
||||||
+ i386_linux_dr_set (lwp->ptid, DR_CONTROL, 0);
|
|
||||||
+
|
|
||||||
for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++)
|
|
||||||
if (state->dr_ref_count[i] > 0)
|
|
||||||
{
|
|
||||||
--- gdb-7.7.90.20140613/gdb/amd64-linux-nat.c.orig 2014-06-19 21:40:37.582534392 +0200
|
|
||||||
+++ gdb-7.7.90.20140613/gdb/amd64-linux-nat.c 2014-06-19 21:41:17.192570902 +0200
|
|
||||||
@@ -415,6 +415,8 @@ amd64_linux_prepare_to_resume (struct lw
|
|
||||||
|
|
||||||
Ensure DR_CONTROL gets written as the very last register here. */
|
|
||||||
|
|
||||||
+ amd64_linux_dr_set (lwp->ptid, DR_CONTROL, 0);
|
|
||||||
+
|
|
||||||
for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++)
|
|
||||||
if (state->dr_ref_count[i] > 0)
|
|
||||||
{
|
|
21
gdb.spec
21
gdb.spec
@ -18,14 +18,14 @@ Summary: A GNU source-level debugger for C, C++, Fortran, Go and other languages
|
|||||||
Name: %{?scl_prefix}gdb
|
Name: %{?scl_prefix}gdb
|
||||||
|
|
||||||
# Freeze it when GDB gets branched
|
# Freeze it when GDB gets branched
|
||||||
%global snapsrc 20140613
|
%global snapsrc 20140627
|
||||||
# See timestamp of source gnulib installed into gdb/gnulib/ .
|
# See timestamp of source gnulib installed into gdb/gnulib/ .
|
||||||
%global snapgnulib 20121213
|
%global snapgnulib 20121213
|
||||||
Version: 7.7.90.20140613
|
Version: 7.7.90.%{snapsrc}
|
||||||
|
|
||||||
# The release always contains a leading reserved number, start it at 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.
|
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||||
Release: 5%{?dist}
|
Release: 6%{?dist}
|
||||||
|
|
||||||
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain and GFDL
|
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
|
Group: Development/Debuggers
|
||||||
@ -218,7 +218,7 @@ Patch231: gdb-6.3-bz202689-exec-from-pthread-test.patch
|
|||||||
|
|
||||||
# Backported fixups post the source tarball.
|
# Backported fixups post the source tarball.
|
||||||
#Xdrop: Just backports.
|
#Xdrop: Just backports.
|
||||||
Patch232: gdb-upstream.patch
|
#Patch232: gdb-upstream.patch
|
||||||
|
|
||||||
# Testcase for PPC Power6/DFP instructions disassembly (BZ 230000).
|
# Testcase for PPC Power6/DFP instructions disassembly (BZ 230000).
|
||||||
#=fedoratest+ppc
|
#=fedoratest+ppc
|
||||||
@ -531,12 +531,6 @@ Patch908: gdb-vla-intel-21of23.patch
|
|||||||
Patch909: gdb-vla-intel-22of23.patch
|
Patch909: gdb-vla-intel-22of23.patch
|
||||||
Patch910: gdb-vla-intel-23of23.patch
|
Patch910: gdb-vla-intel-23of23.patch
|
||||||
|
|
||||||
# Fix ASAN crash regression with demangled names copy (Tom Tromey).
|
|
||||||
Patch911: gdb-bfd-demangled-names.patch
|
|
||||||
|
|
||||||
# Fix gdb-7.8 watchpoint-fork.exp regression (Pedro Alves).
|
|
||||||
Patch913: gdb-watchpoint-fork-fix.patch
|
|
||||||
|
|
||||||
# Fix --with-system-readline with readline-6.3 patch 5.
|
# Fix --with-system-readline with readline-6.3 patch 5.
|
||||||
Patch914: gdb-readline-6.3.5.patch
|
Patch914: gdb-readline-6.3.5.patch
|
||||||
|
|
||||||
@ -716,7 +710,7 @@ find -name "*.info*"|xargs rm -f
|
|||||||
%patch2 -p1
|
%patch2 -p1
|
||||||
|
|
||||||
%patch349 -p1
|
%patch349 -p1
|
||||||
%patch232 -p1
|
#patch232 -p1
|
||||||
%patch888 -p1
|
%patch888 -p1
|
||||||
%patch889 -p1
|
%patch889 -p1
|
||||||
%patch890 -p1
|
%patch890 -p1
|
||||||
@ -839,8 +833,6 @@ find -name "*.info*"|xargs rm -f
|
|||||||
%patch852 -p1
|
%patch852 -p1
|
||||||
%patch863 -p1
|
%patch863 -p1
|
||||||
%patch887 -p1
|
%patch887 -p1
|
||||||
%patch911 -p1
|
|
||||||
%patch913 -p1
|
|
||||||
%patch914 -p1
|
%patch914 -p1
|
||||||
%patch918 -p1
|
%patch918 -p1
|
||||||
|
|
||||||
@ -1328,6 +1320,9 @@ then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Jun 27 2014 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.7.90.20140627-6.fc21
|
||||||
|
- Rebase to FSF GDB 7.7.90.20140627 (pre-7.8 snapshot).
|
||||||
|
|
||||||
* Fri Jun 27 2014 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.7.90.20140613-5.fc21
|
* Fri Jun 27 2014 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.7.90.20140613-5.fc21
|
||||||
- Continue backtrace even if a frame filter throws an exception (Phil Muldoon).
|
- Continue backtrace even if a frame filter throws an exception (Phil Muldoon).
|
||||||
|
|
||||||
|
2
sources
2
sources
@ -1,2 +1,2 @@
|
|||||||
4981307aa9619bbec5b73261e4e41c8d gdb-libstdc++-v3-python-r155978.tar.bz2
|
4981307aa9619bbec5b73261e4e41c8d gdb-libstdc++-v3-python-r155978.tar.bz2
|
||||||
cf4ddceb79fef56b4146e14be72c8727 gdb-7.7.90.20140613.tar.bz2
|
748f54dc55f6e21ce1235492629ef5d8 gdb-7.7.90.20140627.tar.bz2
|
||||||
|
Loading…
Reference in New Issue
Block a user