Reg : gdb crash is seen while attaching a process to gdb.
Yao Qi
qiyaoltc@gmail.com
Thu Apr 27 09:02:00 GMT 2017
RAJESH DASARI <raajeshdasari@gmail.com> writes:
[Move it to gdb-patches@sourceware.org]
> Could someone please provide comments.
>
> diff --git a/gdb/mips-linux-nat.c b/gdb/mips-linux-nat.c
> index 9d22773..68641f8 100644
> --- a/gdb/mips-linux-nat.c
> +++ b/gdb/mips-linux-nat.c
> @@ -634,9 +634,20 @@ mips_linux_new_thread (struct lwp_info *lp)
> &watch_readback_valid, 0))
> return;
>
> + long r;
> + r= ptrace (PTRACE_SET_WATCH_REGS, tid, &watch_mirror, NULL);
> tid = ptid_get_lwp (lp->ptid);
> - if (ptrace (PTRACE_SET_WATCH_REGS, tid, &watch_mirror, NULL) == -1)
> - perror_with_name (_("Couldn't write debug register"));
> + if ( r == -1L && errno == ESRCH )
> + {
> + /* sleep for a while to eliminate race condition on update to kernel
> + * task structure with the process state (STOP state of thread).
> + */
> + usleep(10000);
> + if ( ptrace (PTRACE_SET_WATCH_REGS, tid, &watch_mirror, NULL) == -1 )
> + {
> + perror_with_name (_("Couldn't write debug register"));
> + }
> + }
> }
I am wondering why mips_linux_read_watch_registers
(ptrace (PTRACE_GET_WATCH_REGS) is successful but
ptrace (PTRACE_SET_WATCH_REGS) fails here. Looks they may use different
lwpids. Does the patch work for you?
--
Yao (齐尧)
From dc9b626b826b26431772271c9d9a3ee343d8a1e8 Mon Sep 17 00:00:00 2001
From: Yao Qi <yao.qi@linaro.org>
Date: Thu, 27 Apr 2017 09:59:40 +0100
Subject: [PATCH] Use lwpid from lwp_info instead of inferior_ptid
gdb:
2017-04-27 Yao Qi <yao.qi@linaro.org>
* mips-linux-nat.c (mips_linux_new_thread): Get lwpid from
lwp_info instead of getting from inferior_ptid.
diff --git a/gdb/mips-linux-nat.c b/gdb/mips-linux-nat.c
index 9596b49..c5c18fd 100644
--- a/gdb/mips-linux-nat.c
+++ b/gdb/mips-linux-nat.c
@@ -624,14 +624,13 @@ write_watchpoint_regs (void)
static void
mips_linux_new_thread (struct lwp_info *lp)
{
- int tid;
+ long tid = ptid_get_lwp (lp->ptid);
- if (!mips_linux_read_watch_registers (ptid_get_lwp (inferior_ptid),
+ if (!mips_linux_read_watch_registers (tid,
&watch_readback,
&watch_readback_valid, 0))
return;
- tid = ptid_get_lwp (lp->ptid);
if (ptrace (PTRACE_SET_WATCH_REGS, tid, &watch_mirror, NULL) == -1)
perror_with_name (_("Couldn't write debug register"));
}
More information about the Gdb-patches
mailing list