Index | Thread | Search

From:
Jeremie Courreges-Anglas <jca@wxcvbn.org>
Subject:
Re: extend ptrace(2) PT_GET_THREAD_* to include thread names
To:
kurt@intricatesoftware.com
Cc:
cjeker@diehard.n-r-g.com, mark.kettenis@xs4all.nl, pascal@stumpf.co, ports@openbsd.org, tech@openbsd.org
Date:
Thu, 11 Dec 2025 02:08:49 +0100

Download raw body.

Thread
On Thu, Dec 11, 2025 at 12:37:52AM +0100, Jeremie Courreges-Anglas wrote:
> On Wed, Dec 10, 2025 at 04:41:27PM +0000, kurt@intricatesoftware.com wrote:
> > Instead of gdb using sysctl(2) to get thread names let's extend
> > ptrace(2) PT_GET_THREAD_* to include thread names. This allows
> > gdb to use ptrace for both thread names and thread is alive 
> > detection.
> > 
> > I'm using a new define larger then _MAXCOMLEN to avoid that
> > define and header from propagating in to ptrace.h as well.
> > 
> > The diff for gdb to use this and remove sysctl use follows
> > below as well. This would be committed a few days after the
> > pthread change is committed.
> > 
> > okay for both?
> 
> Works for me and looks correct, ok jca@
> 
> I got curious and looked at what it would take to support both the old
> and new structure sizes, and the diff below appears to work fine.  The
> issue is more of a problem on slower architectures where kernel and
> packages can stay unsynchronized for a longer time.  Thoughts?

The previous diff was unnecessarily complicated.


Index: kern/sys_process.c
===================================================================
RCS file: /home/cvs/src/sys/kern/sys_process.c,v
diff -u -p -r1.106 sys_process.c
--- kern/sys_process.c	17 Feb 2025 15:45:55 -0000	1.106
+++ kern/sys_process.c	11 Dec 2025 00:42:18 -0000
@@ -85,6 +85,10 @@ int	ptrace_kstate(struct proc *, int, pi
 
 int	global_ptrace;	/* [a] permit tracing of not children */
 
+/* Compat, delete after 7.8 */
+struct optrace_thread_state {
+	pid_t	pts_pid;
+};
 
 /*
  * Process debugging system call.
@@ -104,6 +108,7 @@ sys_ptrace(struct proc *p, void *v, regi
 	void *kaddr = NULL;			/* kernelspace */
 	int data = SCARG(uap, data);
 	union {
+		struct optrace_thread_state u_opts;
 		struct ptrace_thread_state u_pts;
 		struct ptrace_io_desc u_piod;
 		struct ptrace_event u_pe;
@@ -144,12 +149,18 @@ sys_ptrace(struct proc *p, void *v, regi
 		break;
 	case PT_GET_THREAD_FIRST:
 		mode = OUT;
-		size = sizeof u.u_pts;
+		if (data == sizeof u.u_opts)
+			size = sizeof u.u_opts;
+		else
+			size = sizeof u.u_pts;
 		kstate = 1;
 		break;
 	case PT_GET_THREAD_NEXT:
 		mode = IN_OUT;
-		size = sizeof u.u_pts;
+		if (data == sizeof u.u_opts)
+			size = sizeof u.u_opts;
+		else
+			size = sizeof u.u_pts;
 		kstate = 1;
 		break;
 	case PT_GET_EVENT_MASK:
@@ -605,8 +616,10 @@ ptrace_kstate(struct proc *p, int req, p
 
 		if (t == NULL)
 			pts->pts_tid = -1;
-		else
+		else {
 			pts->pts_tid = t->p_tid + THREAD_PID_OFFSET;
+			strlcpy(pts->pts_name, t->p_name, sizeof(pts->pts_name));
+		}
 		return 0;
 	      }
 	}
Index: sys/ptrace.h
===================================================================
RCS file: /home/cvs/src/sys/sys/ptrace.h,v
diff -u -p -r1.16 ptrace.h
--- sys/ptrace.h	16 Mar 2020 11:58:46 -0000	1.16
+++ sys/ptrace.h	10 Dec 2025 20:42:35 -0000
@@ -82,8 +82,11 @@ typedef struct ptrace_state {
 #define PT_GET_THREAD_FIRST	15
 #define PT_GET_THREAD_NEXT	16
 
+#define PT_PTS_NAMELEN	32	/* must be >= sizeof(p_name) in struct proc */
+
 struct ptrace_thread_state {
 	pid_t	pts_tid;
+	char	pts_name[PT_PTS_NAMELEN];
 };
 
 #define	PT_FIRSTMACH	32	/* for machine-specific requests */

-- 
jca