1 /* Machine independent support for SVR4 /proc (process file system) for GDB.
3 Copyright (C) 1999-2015 Free Software Foundation, Inc.
5 Written by Michael Snyder at Cygnus Solutions.
6 Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24 * Pretty-print trace of api calls to the /proc api
25 * (ioctl or read/write calls).
31 #include "completer.h"
33 #if defined (NEW_PROC_API)
34 #define _STRUCTURED_PROC 1
37 #include <sys/types.h>
38 #include <sys/procfs.h>
39 #ifdef HAVE_SYS_PROC_H
40 #include <sys/proc.h> /* for struct proc */
42 #ifdef HAVE_SYS_USER_H
43 #include <sys/user.h> /* for struct user */
45 #include <fcntl.h> /* for O_RDWR etc. */
48 #include "proc-utils.h"
50 /* Much of the information used in the /proc interface, particularly for
51 printing status information, is kept as tables of structures of the
52 following form. These tables can be used to map numeric values to
53 their symbolic names and to a string that describes their specific use. */
56 long value
; /* The numeric value */
57 char *name
; /* The equivalent symbolic value */
58 char *desc
; /* Short description of value */
61 static int procfs_trace
= 0;
62 static FILE *procfs_file
= NULL
;
63 static char *procfs_filename
= "procfs_trace";
66 prepare_to_trace (void)
68 if (procfs_trace
) /* if procfs tracing turned on */
69 if (procfs_file
== NULL
) /* if output file not yet open */
70 if (procfs_filename
!= NULL
) /* if output filename known */
71 procfs_file
= fopen (procfs_filename
, "a"); /* open output file */
75 set_procfs_trace_cmd (char *args
, int from_tty
, struct cmd_list_element
*c
)
77 #if 0 /* not sure what I might actually need to do here, if anything */
84 set_procfs_file_cmd (char *args
, int from_tty
, struct cmd_list_element
*c
)
86 /* Just changed the filename for procfs tracing.
87 If a file was already open, close it. */
96 static struct trans ioctl_table
[] = {
97 #ifdef PIOCACINFO /* irix */
98 { PIOCACINFO
, "PIOCACINFO", "get process account info" },
100 { PIOCACTION
, "PIOCACTION", "get signal action structs" },
101 #ifdef PIOCARGUMENTS /* osf */
102 { PIOCARGUMENTS
, "PIOCARGUMENTS", "command line args" },
104 #ifdef PIOCAUXV /* solaris aux vectors */
105 { PIOCAUXV
, "PIOCAUXV", "get aux vector" },
106 { PIOCNAUXV
, "PIOCNAUXV", "get number of aux vector entries" },
108 { PIOCCFAULT
, "PIOCCFAULT", "clear current fault" },
109 { PIOCCRED
, "PIOCCRED", "get process credentials" },
110 #ifdef PIOCENEVCTRS /* irix event counters */
111 { PIOCENEVCTRS
, "PIOCENEVCTRS", "acquire and start event counters" },
112 { PIOCGETEVCTRL
, "PIOCGETEVCTRL", "get control info of event counters" },
113 { PIOCGETEVCTRS
, "PIOCGETEVCTRS", "dump event counters" },
114 { PIOCGETPREVCTRS
, "PIOCGETPREVCTRS", "dump event counters & prusage info" },
115 { PIOCRELEVCTRS
, "PIOCRELEVCTRS", "release/stop event counters" },
116 { PIOCSETEVCTRL
, "PIOCSETEVCTRL", "set control info of event counters" },
117 { PIOCGETPTIMER
, "PIOCGETPTIMER", "get process timers" },
118 #endif /* irix event counters */
119 { PIOCGENTRY
, "PIOCGENTRY", "get traced syscall entry set" },
120 #if defined (PIOCGETPR)
121 { PIOCGETPR
, "PIOCGETPR", "read struct proc" },
123 #if defined (PIOCGETU)
124 { PIOCGETU
, "PIOCGETU", "read user area" },
126 #if defined (PIOCGETUTK) && (defined(KERNEL) || defined(SHOW_UTT)) /* osf */
127 { PIOCGETUTK
, "PIOCGETUTK", "get the utask struct" },
129 { PIOCGEXIT
, "PIOCGEXIT", "get traced syscall exit set" },
130 { PIOCGFAULT
, "PIOCGFAULT", "get traced fault set" },
131 #ifdef PIOCGFPCR /* osf */
132 { PIOCGFPCR
, "PIOCGFPCR", "get FP control register" },
133 { PIOCSFPCR
, "PIOCSFPCR", "set FP conrtol register" },
135 { PIOCGFPREG
, "PIOCGFPREG", "get floating point registers" },
136 { PIOCGHOLD
, "PIOCGHOLD", "get held signal set" },
137 { PIOCGREG
, "PIOCGREG", "get general registers" },
138 { PIOCGROUPS
, "PIOCGROUPS", "get supplementary groups" },
139 #ifdef PIOCGSPCACT /* osf */
140 { PIOCGSPCACT
, "PIOCGSPCACT", "get special action" },
141 { PIOCSSPCACT
, "PIOCSSPCACT", "set special action" },
143 { PIOCGTRACE
, "PIOCGTRACE", "get traced signal set" },
144 #ifdef PIOCGWATCH /* irix watchpoints */
145 { PIOCGWATCH
, "PIOCGWATCH", "get watchpoint" },
146 { PIOCSWATCH
, "PIOCSWATCH", "set watchpoint" },
147 { PIOCNWATCH
, "PIOCNWATCH", "get number of watchpoints" },
148 #endif /* irix watchpoints */
149 #ifdef PIOCGWIN /* solaris sparc */
150 { PIOCGWIN
, "PIOCGWIN", "get gwindows_t" },
152 #ifdef PIOCGXREG /* solaris sparc extra regs */
153 { PIOCGXREGSIZE
, "PIOCXREGSIZE", "get extra register state size" },
154 { PIOCGXREG
, "PIOCGXREG", "get extra register state" },
155 { PIOCSXREG
, "PIOCSXREG", "set extra register state" },
157 { PIOCKILL
, "PIOCKILL", "send signal" },
158 #ifdef PIOCLDT /* solaris i386 */
159 { PIOCLDT
, "PIOCLDT", "get LDT" },
160 { PIOCNLDT
, "PIOCNLDT", "get number of LDT entries" },
162 #ifdef PIOCLSTATUS /* solaris */
163 { PIOCLSTATUS
, "PIOCLSTATUS", "get status of all lwps" },
164 { PIOCLUSAGE
, "PIOCLUSAGE", "get resource usage of all lwps" },
165 { PIOCOPENLWP
, "PIOCOPENLWP", "get lwp file descriptor" },
166 { PIOCLWPIDS
, "PIOCLWPIDS", "get lwp identifiers" },
168 { PIOCMAP
, "PIOCMAP", "get memory map information" },
169 { PIOCMAXSIG
, "PIOCMAXSIG", "get max signal number" },
170 { PIOCNICE
, "PIOCNICE", "set nice priority" },
171 { PIOCNMAP
, "PIOCNMAP", "get number of memory mappings" },
172 { PIOCOPENM
, "PIOCOPENM", "open mapped object for reading" },
173 #ifdef PIOCOPENMOBS /* osf */
174 { PIOCOPENMOBS
, "PIOCOPENMOBS", "open mapped object" },
176 #ifdef PIOCOPENPD /* solaris */
177 { PIOCOPENPD
, "PIOCOPENPD", "get page data file descriptor" },
179 { PIOCPSINFO
, "PIOCPSINFO", "get ps(1) information" },
180 { PIOCRESET
, "PIOCRESET", "reset process flags" },
181 { PIOCRFORK
, "PIOCRFORK", "reset inherit-on-fork flag" },
182 { PIOCRRLC
, "PIOCRRLC", "reset run-on-last-close flag" },
183 { PIOCRUN
, "PIOCRUN", "make process runnable" },
184 #ifdef PIOCSAVECCNTRS /* irix */
185 { PIOCSAVECCNTRS
, "PIOCSAVECCNTRS", "parent gets child cntrs" },
187 { PIOCSENTRY
, "PIOCSENTRY", "set traced syscall entry set" },
188 { PIOCSET
, "PIOCSET", "set process flags" },
189 { PIOCSEXIT
, "PIOCSEXIT", "set traced syscall exit set" },
190 { PIOCSFAULT
, "PIOCSFAULT", "set traced fault set" },
191 { PIOCSFORK
, "PIOCSFORK", "set inherit-on-fork flag" },
192 { PIOCSFPREG
, "PIOCSFPREG", "set floating point registers" },
193 { PIOCSHOLD
, "PIOCSHOLD", "set held signal set" },
194 { PIOCSREG
, "PIOCSREG", "set general registers" },
195 { PIOCSRLC
, "PIOCSRLC", "set run-on-last-close flag" },
196 { PIOCSSIG
, "PIOCSSIG", "set current signal" },
197 { PIOCSTATUS
, "PIOCSTATUS", "get process status" },
198 { PIOCSTOP
, "PIOCSTOP", "post stop request" },
199 { PIOCSTRACE
, "PIOCSTRACE", "set traced signal set" },
200 { PIOCUNKILL
, "PIOCUNKILL", "delete a signal" },
201 #ifdef PIOCUSAGE /* solaris */
202 { PIOCUSAGE
, "PIOCUSAGE", "get resource usage" },
204 { PIOCWSTOP
, "PIOCWSTOP", "wait for process to stop" },
206 #ifdef PIOCNTHR /* osf threads */
207 { PIOCNTHR
, "PIOCNTHR", "get thread count" },
208 { PIOCRTINH
, "PIOCRTINH", "reset inherit-on-thread-creation" },
209 { PIOCSTINH
, "PIOCSTINH", "set inherit-on-thread-creation" },
210 { PIOCTLIST
, "PIOCTLIST", "get thread ids" },
211 { PIOCXPTH
, "PIOCXPTH", "translate port to thread handle" },
212 { PIOCTRUN
, "PIOCTRUN", "make thread runnable" },
213 { PIOCTSTATUS
, "PIOCTSTATUS", "get thread status" },
214 { PIOCTSTOP
, "PIOCTSTOP", "stop a thread" },
215 /* ... TGTRACE TSTRACE TSSIG TKILL TUNKILL TCFAULT TGFAULT TSFAULT
216 TGFPREG TSFPREG TGREG TSREG TACTION TTERM TABRUN TGENTRY TSENTRY
217 TGEXIT TSEXIT TSHOLD ... thread functions */
218 #endif /* osf threads */
223 ioctl_with_trace (int fd
, long opcode
, void *ptr
, char *file
, int line
)
233 for (i
= 0; ioctl_table
[i
].name
!= NULL
; i
++)
234 if (ioctl_table
[i
].value
== opcode
)
238 fprintf (procfs_file
? procfs_file
: stdout
,
239 "%s:%d -- ", file
, line
);
242 arg1
= ptr
? *(long *) ptr
: 0;
243 fprintf (procfs_file
? procfs_file
: stdout
,
244 "ioctl (PIOCSET, %s) %s\n",
245 arg1
== PR_FORK
? "PR_FORK" :
246 arg1
== PR_RLC
? "PR_RLC" :
248 arg1
== PR_ASYNC
? "PR_ASYNC" :
251 info_verbose
? ioctl_table
[i
].desc
: "");
254 arg1
= ptr
? *(long *) ptr
: 0;
255 fprintf (procfs_file
? procfs_file
: stdout
,
256 "ioctl (PIOCRESET, %s) %s\n",
257 arg1
== PR_FORK
? "PR_FORK" :
258 arg1
== PR_RLC
? "PR_RLC" :
260 arg1
== PR_ASYNC
? "PR_ASYNC" :
263 info_verbose
? ioctl_table
[i
].desc
: "");
266 fprintf (procfs_file
? procfs_file
: stdout
,
267 "ioctl (PIOCSTRACE) ");
268 proc_prettyfprint_signalset (procfs_file
? procfs_file
: stdout
,
269 (sigset_t
*) ptr
, 0);
272 fprintf (procfs_file
? procfs_file
: stdout
,
274 opcode
== PIOCSFAULT
? "PIOCSFAULT" : "PIOCGFAULT");
275 proc_prettyfprint_faultset (procfs_file
? procfs_file
: stdout
,
276 (fltset_t
*) ptr
, 0);
279 fprintf (procfs_file
? procfs_file
: stdout
,
281 opcode
== PIOCSENTRY
? "PIOCSENTRY" : "PIOCGENTRY");
282 proc_prettyfprint_syscalls (procfs_file
? procfs_file
: stdout
,
283 (sysset_t
*) ptr
, 0);
286 fprintf (procfs_file
? procfs_file
: stdout
,
288 opcode
== PIOCSEXIT
? "PIOCSEXIT" : "PIOCGEXIT");
289 proc_prettyfprint_syscalls (procfs_file
? procfs_file
: stdout
,
290 (sysset_t
*) ptr
, 0);
293 fprintf (procfs_file
? procfs_file
: stdout
,
295 opcode
== PIOCSHOLD
? "PIOCSHOLD" : "PIOCGHOLD");
296 proc_prettyfprint_signalset (procfs_file
? procfs_file
: stdout
,
297 (sigset_t
*) ptr
, 0);
300 fprintf (procfs_file
? procfs_file
: stdout
,
301 "ioctl (PIOCSSIG) ");
302 proc_prettyfprint_signal (procfs_file
? procfs_file
: stdout
,
303 ptr
? ((siginfo_t
*) ptr
)->si_signo
: 0,
305 fprintf (procfs_file
? procfs_file
: stdout
, "\n");
308 fprintf (procfs_file
? procfs_file
: stdout
,
311 arg1
= ptr
? *(long *) ptr
: 0;
313 fprintf (procfs_file
? procfs_file
: stdout
, "clearSig ");
315 fprintf (procfs_file
? procfs_file
: stdout
, "clearFlt ");
317 fprintf (procfs_file
? procfs_file
: stdout
, "setTrace ");
319 fprintf (procfs_file
? procfs_file
: stdout
, "setHold ");
321 fprintf (procfs_file
? procfs_file
: stdout
, "setFlt ");
323 fprintf (procfs_file
? procfs_file
: stdout
, "setVaddr ");
325 fprintf (procfs_file
? procfs_file
: stdout
, "step ");
327 fprintf (procfs_file
? procfs_file
: stdout
, "syscallAbort ");
329 fprintf (procfs_file
? procfs_file
: stdout
, "stopReq ");
331 fprintf (procfs_file
? procfs_file
: stdout
, "\n");
334 fprintf (procfs_file
? procfs_file
: stdout
,
335 "ioctl (PIOCKILL) ");
336 proc_prettyfprint_signal (procfs_file
? procfs_file
: stdout
,
337 ptr
? *(long *) ptr
: 0, 0);
338 fprintf (procfs_file
? procfs_file
: stdout
, "\n");
342 fprintf (procfs_file
? procfs_file
: stdout
,
343 "ioctl (PIOCSSPCACT) ");
344 arg1
= ptr
? *(long *) ptr
: 0;
345 if (arg1
& PRFS_STOPFORK
)
346 fprintf (procfs_file
? procfs_file
: stdout
, "stopFork ");
347 if (arg1
& PRFS_STOPEXEC
)
348 fprintf (procfs_file
? procfs_file
: stdout
, "stopExec ");
349 if (arg1
& PRFS_STOPTERM
)
350 fprintf (procfs_file
? procfs_file
: stdout
, "stopTerm ");
351 if (arg1
& PRFS_STOPTCR
)
352 fprintf (procfs_file
? procfs_file
: stdout
, "stopThreadCreate ");
353 if (arg1
& PRFS_STOPTTERM
)
354 fprintf (procfs_file
? procfs_file
: stdout
, "stopThreadTerm ");
355 if (arg1
& PRFS_KOLC
)
356 fprintf (procfs_file
? procfs_file
: stdout
, "killOnLastClose ");
357 fprintf (procfs_file
? procfs_file
: stdout
, "\n");
359 #endif /* PIOCSSPCACT */
361 if (ioctl_table
[i
].name
)
362 fprintf (procfs_file
? procfs_file
: stdout
,
365 info_verbose
? ioctl_table
[i
].desc
: "");
367 fprintf (procfs_file
? procfs_file
: stdout
,
368 "ioctl (<unknown %ld (0x%lx)) \n", opcode
, opcode
);
372 fflush (procfs_file
);
375 ret
= ioctl (fd
, opcode
, ptr
);
376 if (procfs_trace
&& ret
< 0)
378 fprintf (procfs_file
? procfs_file
: stdout
,
379 "[ioctl (%s) FAILED! (%s)]\n",
380 ioctl_table
[i
].name
!= NULL
?
381 ioctl_table
[i
].name
: "<unknown>",
382 safe_strerror (errno
));
384 fflush (procfs_file
);
390 #else /* NEW_PROC_API */
392 static struct trans rw_table
[] = {
393 #ifdef PCAGENT /* solaris */
394 { PCAGENT
, "PCAGENT", "create agent lwp with regs from argument" },
396 { PCCFAULT
, "PCCFAULT", "clear current fault" },
397 #ifdef PCCSIG /* solaris */
398 { PCCSIG
, "PCCSIG", "clear current signal" },
400 #ifdef PCDSTOP /* solaris */
401 { PCDSTOP
, "PCDSTOP", "post stop request" },
403 { PCKILL
, "PCKILL", "post a signal" },
404 #ifdef PCNICE /* solaris */
405 { PCNICE
, "PCNICE", "set nice priority" },
407 #ifdef PCREAD /* solaris */
408 { PCREAD
, "PCREAD", "read from the address space" },
409 { PCWRITE
, "PCWRITE", "write to the address space" },
411 { PCRUN
, "PCRUN", "make process/lwp runnable" },
412 #ifdef PCSASRS /* solaris 2.7 only */
413 { PCSASRS
, "PCSASRS", "set ancillary state registers" },
415 #ifdef PCSCRED /* solaris */
416 { PCSCRED
, "PCSCRED", "set process credentials" },
418 { PCSENTRY
, "PCSENTRY", "set traced syscall entry set" },
419 { PCSET
, "PCSET", "set modes" },
420 { PCSEXIT
, "PCSEXIT", "set traced syscall exit set" },
421 { PCSFAULT
, "PCSFAULT", "set traced fault set" },
422 { PCSFPREG
, "PCSFPREG", "set floating point registers" },
423 #ifdef PCSHOLD /* solaris */
424 { PCSHOLD
, "PCSHOLD", "set signal mask" },
426 { PCSREG
, "PCSREG", "set general registers" },
427 { PCSSIG
, "PCSSIG", "set current signal" },
428 { PCSTOP
, "PCSTOP", "post stop request and wait" },
429 { PCSTRACE
, "PCSTRACE", "set traced signal set" },
430 #ifdef PCSVADDR /* solaris */
431 { PCSVADDR
, "PCSVADDR", "set pc virtual address" },
433 #ifdef PCSXREG /* solaris sparc only */
434 { PCSXREG
, "PCSXREG", "set extra registers" },
436 #ifdef PCTWSTOP /* solaris */
437 { PCTWSTOP
, "PCTWSTOP", "wait for stop, with timeout arg" },
439 #ifdef PCUNKILL /* solaris */
440 { PCUNKILL
, "PCUNKILL", "delete a pending signal" },
442 #ifdef PCUNSET /* solaris */
443 { PCUNSET
, "PCUNSET", "unset modes" },
445 #ifdef PCWATCH /* solaris */
446 { PCWATCH
, "PCWATCH", "set/unset watched memory area" },
448 { PCWSTOP
, "PCWSTOP", "wait for process/lwp to stop, no timeout" },
452 static off_t lseek_offset
;
455 write_with_trace (int fd
, void *varg
, size_t len
, char *file
, int line
)
457 int i
= ARRAY_SIZE (rw_table
) - 1;
459 procfs_ctl_t
*arg
= (procfs_ctl_t
*) varg
;
464 procfs_ctl_t opcode
= arg
[0];
465 for (i
= 0; rw_table
[i
].name
!= NULL
; i
++)
466 if (rw_table
[i
].value
== opcode
)
470 fprintf (procfs_file
? procfs_file
: stdout
,
471 "%s:%d -- ", file
, line
);
474 fprintf (procfs_file
? procfs_file
: stdout
,
475 "write (PCSET, %s) %s\n",
476 arg
[1] == PR_FORK
? "PR_FORK" :
477 arg
[1] == PR_RLC
? "PR_RLC" :
479 arg
[1] == PR_ASYNC
? "PR_ASYNC" :
482 info_verbose
? rw_table
[i
].desc
: "");
488 #if PCRESET != PCUNSET
492 fprintf (procfs_file
? procfs_file
: stdout
,
493 "write (PCRESET, %s) %s\n",
494 arg
[1] == PR_FORK
? "PR_FORK" :
495 arg
[1] == PR_RLC
? "PR_RLC" :
497 arg
[1] == PR_ASYNC
? "PR_ASYNC" :
500 info_verbose
? rw_table
[i
].desc
: "");
503 fprintf (procfs_file
? procfs_file
: stdout
,
504 "write (PCSTRACE) ");
505 proc_prettyfprint_signalset (procfs_file
? procfs_file
: stdout
,
506 (sigset_t
*) &arg
[1], 0);
509 fprintf (procfs_file
? procfs_file
: stdout
,
510 "write (PCSFAULT) ");
511 proc_prettyfprint_faultset (procfs_file
? procfs_file
: stdout
,
512 (fltset_t
*) &arg
[1], 0);
515 fprintf (procfs_file
? procfs_file
: stdout
,
516 "write (PCSENTRY) ");
517 proc_prettyfprint_syscalls (procfs_file
? procfs_file
: stdout
,
518 (sysset_t
*) &arg
[1], 0);
521 fprintf (procfs_file
? procfs_file
: stdout
,
523 proc_prettyfprint_syscalls (procfs_file
? procfs_file
: stdout
,
524 (sysset_t
*) &arg
[1], 0);
528 fprintf (procfs_file
? procfs_file
: stdout
,
530 proc_prettyfprint_signalset (procfs_file
? procfs_file
: stdout
,
531 (sigset_t
*) &arg
[1], 0);
535 fprintf (procfs_file
? procfs_file
: stdout
,
537 proc_prettyfprint_signal (procfs_file
? procfs_file
: stdout
,
538 arg
[1] ? ((siginfo_t
*) &arg
[1])->si_signo
541 fprintf (procfs_file
? procfs_file
: stdout
, "\n");
544 fprintf (procfs_file
? procfs_file
: stdout
,
547 fprintf (procfs_file
? procfs_file
: stdout
, "clearSig ");
548 if (arg
[1] & PRCFAULT
)
549 fprintf (procfs_file
? procfs_file
: stdout
, "clearFlt ");
551 fprintf (procfs_file
? procfs_file
: stdout
, "step ");
553 if (arg
[1] & PRSABORT
)
554 fprintf (procfs_file
? procfs_file
: stdout
, "syscallAbort ");
558 fprintf (procfs_file
? procfs_file
: stdout
, "stopReq ");
561 fprintf (procfs_file
? procfs_file
: stdout
, "\n");
564 fprintf (procfs_file
? procfs_file
: stdout
,
566 proc_prettyfprint_signal (procfs_file
? procfs_file
: stdout
,
568 fprintf (procfs_file
? procfs_file
: stdout
, "\n");
572 if (rw_table
[i
].name
)
573 fprintf (procfs_file
? procfs_file
: stdout
,
576 info_verbose
? rw_table
[i
].desc
: "");
579 if (lseek_offset
!= -1)
580 fprintf (procfs_file
? procfs_file
: stdout
,
581 "write (<unknown>, %lud bytes at 0x%08lx) \n",
582 (unsigned long) len
, (unsigned long) lseek_offset
);
584 fprintf (procfs_file
? procfs_file
: stdout
,
585 "write (<unknown>, %lud bytes) \n",
586 (unsigned long) len
);
592 fflush (procfs_file
);
595 ret
= write (fd
, (void *) arg
, len
);
596 if (procfs_trace
&& ret
!= len
)
598 fprintf (procfs_file
? procfs_file
: stdout
,
599 "[write (%s) FAILED! (%s)]\n",
600 rw_table
[i
].name
!= NULL
?
601 rw_table
[i
].name
: "<unknown>",
602 safe_strerror (errno
));
604 fflush (procfs_file
);
612 lseek_with_trace (int fd
, off_t offset
, int whence
, char *file
, int line
)
618 ret
= lseek (fd
, offset
, whence
);
620 if (procfs_trace
&& (ret
== -1 || errno
!= 0))
622 fprintf (procfs_file
? procfs_file
: stdout
,
623 "[lseek (0x%08lx) FAILED! (%s)]\n",
624 (unsigned long) offset
, safe_strerror (errno
));
626 fflush (procfs_file
);
632 #endif /* NEW_PROC_API */
635 open_with_trace (char *filename
, int mode
, char *file
, int line
)
641 ret
= open (filename
, mode
);
645 fprintf (procfs_file
? procfs_file
: stdout
,
646 "%s:%d -- ", file
, line
);
650 fprintf (procfs_file
? procfs_file
: stdout
,
651 "[open FAILED! (%s) line %d]\\n",
652 safe_strerror (errno
), line
);
656 fprintf (procfs_file
? procfs_file
: stdout
,
657 "%d = open (%s, ", ret
, filename
);
658 if (mode
== O_RDONLY
)
659 fprintf (procfs_file
? procfs_file
: stdout
, "O_RDONLY) %d\n",
661 else if (mode
== O_WRONLY
)
662 fprintf (procfs_file
? procfs_file
: stdout
, "O_WRONLY) %d\n",
664 else if (mode
== O_RDWR
)
665 fprintf (procfs_file
? procfs_file
: stdout
, "O_RDWR) %d\n",
669 fflush (procfs_file
);
676 close_with_trace (int fd
, char *file
, int line
)
686 fprintf (procfs_file
? procfs_file
: stdout
,
687 "%s:%d -- ", file
, line
);
689 fprintf (procfs_file
? procfs_file
: stdout
,
690 "[close FAILED! (%s)]\n", safe_strerror (errno
));
692 fprintf (procfs_file
? procfs_file
: stdout
,
693 "%d = close (%d)\n", ret
, fd
);
695 fflush (procfs_file
);
702 wait_with_trace (int *wstat
, char *file
, int line
)
710 fprintf (procfs_file
? procfs_file
: stdout
,
711 "%s:%d -- ", file
, line
);
712 fprintf (procfs_file
? procfs_file
: stdout
,
713 "wait (line %d) ", line
);
715 fflush (procfs_file
);
722 fprintf (procfs_file
? procfs_file
: stdout
,
723 "[wait FAILED! (%s)]\n", safe_strerror (errno
));
725 fprintf (procfs_file
? procfs_file
: stdout
,
726 "returned pid %d, status 0x%x\n", ret
, lstat
);
728 fflush (procfs_file
);
737 procfs_note (char *msg
, char *file
, int line
)
743 fprintf (procfs_file
? procfs_file
: stdout
,
744 "%s:%d -- ", file
, line
);
745 fprintf (procfs_file
? procfs_file
: stdout
, "%s", msg
);
747 fflush (procfs_file
);
752 proc_prettyfprint_status (long flags
, int why
, int what
, int thread
)
758 fprintf (procfs_file
? procfs_file
: stdout
,
759 "Thread %d: ", thread
);
761 proc_prettyfprint_flags (procfs_file
? procfs_file
: stdout
,
764 if (flags
& (PR_STOPPED
| PR_ISTOP
))
765 proc_prettyfprint_why (procfs_file
? procfs_file
: stdout
,
768 fflush (procfs_file
);
773 /* Provide a prototype to silence -Wmissing-prototypes. */
774 extern void _initialize_proc_api (void);
777 _initialize_proc_api (void)
779 struct cmd_list_element
*c
;
781 add_setshow_boolean_cmd ("procfs-trace", no_class
, &procfs_trace
, _("\
782 Set tracing for /proc api calls."), _("\
783 Show tracing for /proc api calls."), NULL
,
784 set_procfs_trace_cmd
,
785 NULL
, /* FIXME: i18n: */
786 &setlist
, &showlist
);
788 add_setshow_filename_cmd ("procfs-file", no_class
, &procfs_filename
, _("\
789 Set filename for /proc tracefile."), _("\
790 Show filename for /proc tracefile."), NULL
,
792 NULL
, /* FIXME: i18n: */
793 &setlist
, &showlist
);