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-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
|
||||
|
||||
# Freeze it when GDB gets branched
|
||||
%global snapsrc 20140613
|
||||
%global snapsrc 20140627
|
||||
# See timestamp of source gnulib installed into gdb/gnulib/ .
|
||||
%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.
|
||||
# `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
|
||||
Group: Development/Debuggers
|
||||
@ -218,7 +218,7 @@ Patch231: gdb-6.3-bz202689-exec-from-pthread-test.patch
|
||||
|
||||
# Backported fixups post the source tarball.
|
||||
#Xdrop: Just backports.
|
||||
Patch232: gdb-upstream.patch
|
||||
#Patch232: gdb-upstream.patch
|
||||
|
||||
# Testcase for PPC Power6/DFP instructions disassembly (BZ 230000).
|
||||
#=fedoratest+ppc
|
||||
@ -531,12 +531,6 @@ Patch908: gdb-vla-intel-21of23.patch
|
||||
Patch909: gdb-vla-intel-22of23.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.
|
||||
Patch914: gdb-readline-6.3.5.patch
|
||||
|
||||
@ -716,7 +710,7 @@ find -name "*.info*"|xargs rm -f
|
||||
%patch2 -p1
|
||||
|
||||
%patch349 -p1
|
||||
%patch232 -p1
|
||||
#patch232 -p1
|
||||
%patch888 -p1
|
||||
%patch889 -p1
|
||||
%patch890 -p1
|
||||
@ -839,8 +833,6 @@ find -name "*.info*"|xargs rm -f
|
||||
%patch852 -p1
|
||||
%patch863 -p1
|
||||
%patch887 -p1
|
||||
%patch911 -p1
|
||||
%patch913 -p1
|
||||
%patch914 -p1
|
||||
%patch918 -p1
|
||||
|
||||
@ -1328,6 +1320,9 @@ then
|
||||
fi
|
||||
|
||||
%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
|
||||
- Continue backtrace even if a frame filter throws an exception (Phil Muldoon).
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user