1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <libproc.h>
#include "ramdata.h"
#include "proto.h"
#include "htbl.h"
/*
* ramdata.c -- read/write data definitions are collected here.
* Default initialization of zero applies in all cases.
*/
thread_key_t private_key; /* set by thr_keycreate() */
char *command; /* name of command ("truss") */
int interrupt; /* interrupt signal was received */
int sigusr1; /* received SIGUSR1 (release process) */
int sfd; /* shared tmp file descriptor */
pid_t created; /* if process was created, its process id */
uid_t Euid; /* truss's effective uid */
uid_t Egid; /* truss's effective gid */
uid_t Ruid; /* truss's real uid */
uid_t Rgid; /* truss's real gid */
prcred_t credentials; /* traced process credentials */
prpriv_t *privdata; /* traced process privileges */
int istty; /* TRUE iff output is a tty */
time_t starttime; /* start time */
int Fflag; /* option flags from getopt() */
int fflag;
int cflag;
int aflag;
int eflag;
int iflag;
int lflag;
int tflag;
int pflag;
int sflag;
int mflag;
int oflag;
int vflag;
int xflag;
int hflag;
int dflag;
int Dflag;
int Eflag;
int Tflag;
int Sflag;
int Mflag;
sysset_t trace; /* sys calls to trace */
sysset_t traceeven; /* sys calls to trace even if not reported */
sysset_t verbose; /* sys calls to be verbose about */
sysset_t rawout; /* sys calls to show in raw mode */
sigset_t signals; /* signals to trace */
fltset_t faults; /* faults to trace */
fileset_t readfd; /* read() file descriptors to dump */
fileset_t writefd; /* write() file descriptors to dump */
mutex_t truss_lock; /* protects almost everything */
cond_t truss_cv;
mutex_t count_lock; /* lock protecting count struct Cp */
htbl_t *fcall_tbl; /* ptr to hash tbl counting function calls */
int truss_nlwp; /* number of truss lwps */
int truss_maxlwp; /* number of entries in truss_lwpid */
lwpid_t *truss_lwpid; /* array of truss lwpid's */
struct counts *Cp; /* for counting: malloc() or shared memory */
struct global_psinfo *gps; /* contains global process information */
struct dynlib *Dynlib; /* for tracing functions in shared libraries */
struct dynpat *Dynpat;
struct dynpat *Lastpat;
struct bkpt **bpt_hashtable; /* breakpoint hash table */
uint_t nthr_create; /* number of thr_create() calls seen so far */
struct callstack *callstack; /* the callstack array */
uint_t nstack; /* number of detected stacks */
rd_agent_t *Rdb_agent; /* run-time linker debug handle */
td_thragent_t *Thr_agent; /* thread debug handle */
int not_consist; /* used while rebuilding breakpoint table */
int delete_library; /* used while rebuilding breakpoint table */
pid_t ancestor; /* top-level parent process id */
int descendent; /* TRUE iff descendent of top level */
int is_vfork_child; /* TRUE iff process is a vfork()ed child */
int ngrab; /* number of pid's that were grabbed */
struct ps_prochandle *Proc; /* global reference to process */
int data_model; /* PR_MODEL_LP64 or PR_MODEL_ILP32 */
long pagesize; /* bytes per page; should be per-process */
int exit_called; /* _exit() syscall was seen */
lwpid_t primary_lwp; /* representative lwp on process grab */
sysset_t syshang; /* sys calls to make process hang */
sigset_t sighang; /* signals to make process hang */
fltset_t flthang; /* faults to make process hang */
sigset_t emptyset; /* no signals, for thr_sigsetmask() */
sigset_t fillset; /* all signals, for thr_sigsetmask() */
int leave_hung; /* if TRUE, leave the process hung */
|