Subject: bin/26452: ps(1) use too many spaces for LID display on 64bit platforms
To: None <gnats-bugs@gnats.NetBSD.org>
From: None <njoly@pasteur1.fr>
List: netbsd-bugs
Date: 07/27/2004 23:43:53
>Number: 26452
>Category: bin
>Synopsis: ps(1) use too many spaces for LID display on 64bit platforms
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: bin-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Tue Jul 27 21:44:00 UTC 2004
>Closed-Date:
>Last-Modified:
>Originator: Nicolas Joly
>Release: NetBSD 2.0G
>Organization:
Institut Pasteur
>Environment:
System: NetBSD lanfeust.sis.pasteur.fr 2.0G NetBSD 2.0G (LANFEUST) #11: Tue Jul 27 00:06:31 CEST 2004 njoly@lanfeust.sis.pasteur.fr:/local/src/NetBSD/obj/amd64/sys/arch/amd64/compile/LANFEUST amd64
Architecture: x86_64
Machine: amd64
>Description:
The ps(1) command seems to have a problem with the LID column display on 64
bits platforms (at least on alpha and amd64). The calculated column width
is wrong, which leads in extra spaces on display.
njoly@lanfeust [tmp/ps]> ps -s
UID PID PPID CPU LID NLWP PRI NI VSZ RSS WCHAN STAT TT TIME COMMAND
1000 2535 3486 0 1 1 18 0 220 2116 pause I p1 0:00.55 -zs
1000 2801 2535 0 1 1 2 0 240 1224 poll S p1 0:17.41 top
1000 1619 1854 0 1 1 18 0 224 2156 pause I p2 0:00.01 -zs
1000 2851 1619 0 1 1 2 0 104 704 kqread I p2 0:00.00 tai
1000 2164 2981 0 1 1 3 0 304 2244 ttyin I p3 0:00.07 -zs
1000 3746 4408 0 1 1 18 0 220 2164 pause S p4 0:00.02 -zs
1000 5210 3746 0 1 1 28 0 92 784 - R p4 0:00.00 ./p
1000 2209 1835 0 1 1 18 0 304 2232 pause I p5 0:00.02 -zs
1000 3762 2209 6 1 1 10 0 208 1040 wait I p5 0:00.01 /bi
1000 4986 3762 0 1 1 3 0 668 1640 ttyin S p5 0:00.04 vi
I noticed that `lid' fields definition (keyword.c:125) seems to be incorrect:
LVAR("lid", "LID", 0, l_lid, ULONG, "d")
the 6th argument (printf format) is %d for an integer, but the associated type
is set to ULONG. On 64 bits system, we are currently mixing 32 and 64 bits
types.
I checked that `l_lid' field is of type `lwpid_t', which defined as `int32_t'.
njoly@lanfeust [tmp/ps]> grep l_lid /usr/include/sys/lwp.h
lwpid_t l_lid; /* LWP identifier; local to process. */
njoly@lanfeust [tmp/ps]> grep lwpid_t /usr/include/sys/types.h
typedef int32_t lwpid_t; /* LWP id */
By changing, the ULONG definition to INT32, the display looks better (just
like the i386 output).
njoly@lanfeust [tmp/ps]> ./ps.new -s
UID PID PPID CPU LID NLWP PRI NI VSZ RSS WCHAN STAT TT TIME COMMAND
1000 2535 3486 0 1 1 18 0 220 2116 pause I p1 0:00.55 -zsh
1000 2801 2535 0 1 1 2 0 240 1224 poll S p1 0:17.90 top -s 1
1000 1619 1854 0 1 1 18 0 224 2156 pause I p2 0:00.01 -zsh
1000 2851 1619 0 1 1 2 0 104 704 kqread I p2 0:00.00 tail -f /var
1000 2164 2981 0 1 1 3 0 304 2244 ttyin I p3 0:00.07 -zsh
1000 3746 4408 0 1 1 18 0 228 2176 pause S p4 0:00.03 -zsh
1000 5302 3746 0 1 1 28 0 92 780 - R p4 0:00.00 ./ps.new -s
1000 2209 1835 0 1 1 18 0 304 2232 pause I p5 0:00.02 -zsh
1000 3762 2209 6 1 1 10 0 208 1040 wait I p5 0:00.01 /bin/sh /usr
1000 4986 3762 0 1 1 3 0 796 1788 ttyin S p5 0:00.11 vi /tmp/p.00
>How-To-Repeat:
Try to run `ps -s' or `ps -o lid' on a 64 bit platform.
>Fix:
Index: bin/ps/keyword.c
===================================================================
RCS file: /cvsroot/src/bin/ps/keyword.c,v
retrieving revision 1.40
diff -u -r1.40 keyword.c
--- bin/ps/keyword.c 27 Mar 2004 14:52:36 -0000 1.40
+++ bin/ps/keyword.c 26 Jul 2004 23:17:54 -0000
@@ -122,7 +122,7 @@
PVAR("jobc", "JOBC", 0, p_jobc, SHORT, "d"),
PVAR("ktrace", "KTRACE", 0, p_traceflag, INT, "x"),
/*XXX*/ PVAR("ktracep", "KTRACEP", 0, p_tracep, KPTR, PRIx64),
- LVAR("lid", "LID", 0, l_lid, ULONG, "d"),
+ LVAR("lid", "LID", 0, l_lid, INT32, "d"),
{"lim", "LIM", 0, maxrss},
{"login", "LOGIN", LJUST, logname},
{"logname", "login", ALIAS},
>Release-Note:
>Audit-Trail:
>Unformatted: