1b725ae77Skettenis /* Machine independent support for SVR4 /proc (process file system) for GDB.
2b725ae77Skettenis Copyright 1999, 2000 Free Software Foundation, Inc.
3b725ae77Skettenis Written by Michael Snyder at Cygnus Solutions.
4b725ae77Skettenis Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
5b725ae77Skettenis
6b725ae77Skettenis This file is part of GDB.
7b725ae77Skettenis
8b725ae77Skettenis This program is free software; you can redistribute it and/or modify
9b725ae77Skettenis it under the terms of the GNU General Public License as published by
10b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
11b725ae77Skettenis (at your option) any later version.
12b725ae77Skettenis
13b725ae77Skettenis This program is distributed in the hope that it will be useful,
14b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
15b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16b725ae77Skettenis GNU General Public License for more details.
17b725ae77Skettenis
18b725ae77Skettenis You should have received a copy of the GNU General Public License
19b725ae77Skettenis along with this program; if not, write to the Free Software Foundation,
20b725ae77Skettenis Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21b725ae77Skettenis
22b725ae77Skettenis /*
23b725ae77Skettenis * Pretty-print the pr_why value.
24b725ae77Skettenis *
25b725ae77Skettenis * Arguments: unsigned long flags, int verbose
26b725ae77Skettenis *
27b725ae77Skettenis */
28b725ae77Skettenis
29b725ae77Skettenis #include "defs.h"
30b725ae77Skettenis
31b725ae77Skettenis #if defined(NEW_PROC_API)
32b725ae77Skettenis #define _STRUCTURED_PROC 1
33b725ae77Skettenis #endif
34b725ae77Skettenis
35b725ae77Skettenis #include <stdio.h>
36b725ae77Skettenis #include <sys/types.h>
37b725ae77Skettenis #include <sys/procfs.h>
38b725ae77Skettenis
39b725ae77Skettenis #include "proc-utils.h"
40b725ae77Skettenis
41b725ae77Skettenis /* Much of the information used in the /proc interface, particularly for
42b725ae77Skettenis printing status information, is kept as tables of structures of the
43b725ae77Skettenis following form. These tables can be used to map numeric values to
44b725ae77Skettenis their symbolic names and to a string that describes their specific use. */
45b725ae77Skettenis
46b725ae77Skettenis struct trans {
47b725ae77Skettenis int value; /* The numeric value */
48b725ae77Skettenis char *name; /* The equivalent symbolic value */
49b725ae77Skettenis char *desc; /* Short description of value */
50b725ae77Skettenis };
51b725ae77Skettenis
52b725ae77Skettenis /* Translate values in the pr_why field of the prstatus struct. */
53b725ae77Skettenis
54b725ae77Skettenis static struct trans pr_why_table[] =
55b725ae77Skettenis {
56b725ae77Skettenis #if defined (PR_REQUESTED)
57b725ae77Skettenis /* All platforms */
58b725ae77Skettenis { PR_REQUESTED, "PR_REQUESTED",
59b725ae77Skettenis "Directed to stop by debugger via P(IO)CSTOP or P(IO)CWSTOP" },
60b725ae77Skettenis #endif
61b725ae77Skettenis #if defined (PR_SIGNALLED)
62b725ae77Skettenis /* All platforms */
63b725ae77Skettenis { PR_SIGNALLED, "PR_SIGNALLED", "Receipt of a traced signal" },
64b725ae77Skettenis #endif
65b725ae77Skettenis #if defined (PR_SYSENTRY)
66b725ae77Skettenis /* All platforms */
67b725ae77Skettenis { PR_SYSENTRY, "PR_SYSENTRY", "Entry to a traced system call" },
68b725ae77Skettenis #endif
69b725ae77Skettenis #if defined (PR_SYSEXIT)
70b725ae77Skettenis /* All platforms */
71b725ae77Skettenis { PR_SYSEXIT, "PR_SYSEXIT", "Exit from a traced system call" },
72b725ae77Skettenis #endif
73b725ae77Skettenis #if defined (PR_JOBCONTROL)
74b725ae77Skettenis /* All platforms */
75b725ae77Skettenis { PR_JOBCONTROL, "PR_JOBCONTROL", "Default job control stop signal action" },
76b725ae77Skettenis #endif
77b725ae77Skettenis #if defined (PR_FAULTED)
78b725ae77Skettenis /* All platforms */
79b725ae77Skettenis { PR_FAULTED, "PR_FAULTED", "Incurred a traced hardware fault" },
80b725ae77Skettenis #endif
81b725ae77Skettenis #if defined (PR_SUSPENDED)
82b725ae77Skettenis /* Solaris and UnixWare */
83b725ae77Skettenis { PR_SUSPENDED, "PR_SUSPENDED", "Process suspended" },
84b725ae77Skettenis #endif
85b725ae77Skettenis #if defined (PR_CHECKPOINT)
86b725ae77Skettenis /* Solaris only */
87b725ae77Skettenis { PR_CHECKPOINT, "PR_CHECKPOINT", "Process stopped at checkpoint" },
88b725ae77Skettenis #endif
89b725ae77Skettenis #if defined (PR_FORKSTOP)
90b725ae77Skettenis /* OSF only */
91b725ae77Skettenis { PR_FORKSTOP, "PR_FORKSTOP", "Process stopped at end of fork call" },
92b725ae77Skettenis #endif
93b725ae77Skettenis #if defined (PR_TCRSTOP)
94b725ae77Skettenis /* OSF only */
95b725ae77Skettenis { PR_TCRSTOP, "PR_TCRSTOP", "Process stopped on thread creation" },
96b725ae77Skettenis #endif
97b725ae77Skettenis #if defined (PR_TTSTOP)
98b725ae77Skettenis /* OSF only */
99b725ae77Skettenis { PR_TTSTOP, "PR_TTSTOP", "Process stopped on thread termination" },
100b725ae77Skettenis #endif
101b725ae77Skettenis #if defined (PR_DEAD)
102b725ae77Skettenis /* OSF only */
103b725ae77Skettenis { PR_DEAD, "PR_DEAD", "Process stopped in exit system call" },
104b725ae77Skettenis #endif
105b725ae77Skettenis };
106b725ae77Skettenis
107b725ae77Skettenis void
proc_prettyfprint_why(FILE * file,unsigned long why,unsigned long what,int verbose)108b725ae77Skettenis proc_prettyfprint_why (FILE *file, unsigned long why, unsigned long what,
109b725ae77Skettenis int verbose)
110b725ae77Skettenis {
111b725ae77Skettenis int i;
112b725ae77Skettenis
113b725ae77Skettenis if (why == 0)
114b725ae77Skettenis return;
115b725ae77Skettenis
116b725ae77Skettenis for (i = 0; i < sizeof (pr_why_table) / sizeof (pr_why_table[0]); i++)
117b725ae77Skettenis if (why == pr_why_table[i].value)
118b725ae77Skettenis {
119b725ae77Skettenis fprintf (file, "%s ", pr_why_table[i].name);
120b725ae77Skettenis if (verbose)
121b725ae77Skettenis fprintf (file, ": %s ", pr_why_table[i].desc);
122b725ae77Skettenis
123b725ae77Skettenis switch (why) {
124b725ae77Skettenis #ifdef PR_REQUESTED
125b725ae77Skettenis case PR_REQUESTED:
126b725ae77Skettenis break; /* Nothing more to print. */
127b725ae77Skettenis #endif
128b725ae77Skettenis #ifdef PR_SIGNALLED
129b725ae77Skettenis case PR_SIGNALLED:
130b725ae77Skettenis proc_prettyfprint_signal (file, what, verbose);
131b725ae77Skettenis break;
132b725ae77Skettenis #endif
133b725ae77Skettenis #ifdef PR_FAULTED
134b725ae77Skettenis case PR_FAULTED:
135b725ae77Skettenis proc_prettyfprint_fault (file, what, verbose);
136b725ae77Skettenis break;
137b725ae77Skettenis #endif
138b725ae77Skettenis #ifdef PR_SYSENTRY
139b725ae77Skettenis case PR_SYSENTRY:
140b725ae77Skettenis fprintf (file, "Entry to ");
141b725ae77Skettenis proc_prettyfprint_syscall (file, what, verbose);
142b725ae77Skettenis break;
143b725ae77Skettenis #endif
144b725ae77Skettenis #ifdef PR_SYSEXIT
145b725ae77Skettenis case PR_SYSEXIT:
146b725ae77Skettenis fprintf (file, "Exit from ");
147b725ae77Skettenis proc_prettyfprint_syscall (file, what, verbose);
148b725ae77Skettenis break;
149b725ae77Skettenis #endif
150b725ae77Skettenis #ifdef PR_JOBCONTROL
151b725ae77Skettenis case PR_JOBCONTROL:
152b725ae77Skettenis proc_prettyfprint_signal (file, what, verbose);
153b725ae77Skettenis break;
154b725ae77Skettenis #endif
155b725ae77Skettenis #ifdef PR_DEAD
156b725ae77Skettenis case PR_DEAD:
157*11efff7fSkettenis fprintf (file, "Exit status: %ld\n", what);
158b725ae77Skettenis break;
159b725ae77Skettenis #endif
160b725ae77Skettenis default:
161b725ae77Skettenis fprintf (file, "Unknown why %ld, what %ld\n", why, what);
162b725ae77Skettenis break;
163b725ae77Skettenis }
164b725ae77Skettenis fprintf (file, "\n");
165b725ae77Skettenis
166b725ae77Skettenis return;
167b725ae77Skettenis }
168b725ae77Skettenis fprintf (file, "Unknown pr_why.\n");
169b725ae77Skettenis }
170b725ae77Skettenis
171b725ae77Skettenis void
proc_prettyprint_why(unsigned long why,unsigned long what,int verbose)172b725ae77Skettenis proc_prettyprint_why (unsigned long why, unsigned long what, int verbose)
173b725ae77Skettenis {
174b725ae77Skettenis proc_prettyfprint_why (stdout, why, what, verbose);
175b725ae77Skettenis }
176