This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb/gdb-7.12-branch] Quiet ptrace error ESRCH in regsets_fetch_inferior_registers


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=367ed8910ee791720f99a28ad0320f430bd910d9

commit 367ed8910ee791720f99a28ad0320f430bd910d9
Author: Yao Qi <yao.qi@linaro.org>
Date:   Thu Aug 4 10:44:18 2016 +0100

    Quiet ptrace error ESRCH in regsets_fetch_inferior_registers
    
    When I run process-dies-while-detaching.exp with GDBserver, I see many
    warnings printed by GDBserver,
    
    ptrace(regsets_fetch_inferior_registers) PID=26183: No such process
    ptrace(regsets_fetch_inferior_registers) PID=26183: No such process
    ptrace(regsets_fetch_inferior_registers) PID=26184: No such process
    ptrace(regsets_fetch_inferior_registers) PID=26184: No such process
    
    regsets_fetch_inferior_registers is called when GDBserver resumes each
    lwp.
    
     #2  0x0000000000428260 in regsets_fetch_inferior_registers (regsets_info=0x4690d0 <aarch64_regsets_info>, regcache=0x31832020)
        at /home/yao/SourceCode/gnu/gdb/git/gdb/gdbserver/linux-low.c:5412
     #3  0x00000000004070e8 in get_thread_regcache (thread=0x31832940, fetch=fetch@entry=1) at /home/yao/SourceCode/gnu/gdb/git/gdb/gdbserver/regcache.c:58
     #4  0x0000000000429c40 in linux_resume_one_lwp_throw (info=<optimized out>, signal=0, step=0, lwp=0x31832830)
        at /home/yao/SourceCode/gnu/gdb/git/gdb/gdbserver/linux-low.c:4463
     #5  linux_resume_one_lwp (lwp=0x31832830, step=<optimized out>, signal=<optimized out>, info=<optimized out>)
        at /home/yao/SourceCode/gnu/gdb/git/gdb/gdbserver/linux-low.c:4573
    
    The is the case that threads are disappeared when GDB/GDBserver resumes
    them.  We check errno for ESRCH, and don't print error messages, like
    what we are doing in regsets_store_inferior_registers.
    
    gdb/gdbserver:
    
    2016-08-04  Yao Qi  <yao.qi@linaro.org>
    
    	* linux-low.c (regsets_fetch_inferior_registers): Check
    	errno is ESRCH or not.

Diff:
---
 gdb/gdbserver/ChangeLog   | 5 +++++
 gdb/gdbserver/linux-low.c | 6 ++++++
 2 files changed, 11 insertions(+)

diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index dfdbc21..13562e0 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,8 @@
+2016-08-04  Yao Qi  <yao.qi@linaro.org>
+
+	* linux-low.c (regsets_fetch_inferior_registers): Check
+	errno is ESRCH or not.
+
 2016-07-26  Pedro Alves  <palves@redhat.com>
 
 	PR server/20414
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index e251ac4..1839f99 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -5405,6 +5405,12 @@ regsets_fetch_inferior_registers (struct regsets_info *regsets_info,
 		 not "active".  This can happen in normal operation,
 		 so suppress the warning in this case.  */
 	    }
+	  else if (errno == ESRCH)
+	    {
+	      /* At this point, ESRCH should mean the process is
+		 already gone, in which case we simply ignore attempts
+		 to read its registers.  */
+	    }
 	  else
 	    {
 	      char s[256];


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]