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
|
/* Framework for new probes using the runtime */
/* this example shows both kprobes and jprobes although you */
/* likely will only want one. */
/* define this if you don't want to use relayfs. Normally */
/* you want relayfs, unless you need a realtime stream of data */
#define STP_NETLINK_ONLY
/* How many strings to allocate. see strings.c. Default is 0. */
#define STP_NUM_STRINGS 1
/* maximum size for a string. default is 2048 */
#define STP_STRING_SIZE 2048
/* size of strings saved in maps */
#define MAP_STRING_LENGTH 256
/* width of histograms. Default 50 */
#define HIST_WIDTH 50
/* always include this. Put all non-map defines above it. */
#include "runtime.h"
/* These are the possible values a map can have. */
/* Comment out unused ones. Comment out all if you don't need maps. */
#define NEED_INT64_VALS
#define NEED_STRING_VALS
#define NEED_STAT_VALS
/* now for each set of keys, define the key type and include map-keys.c */
/* This define a single key of int64, for example map1[2048] */
#define KEY1_TYPE INT64
#include "map-keys.c"
/* This generates code to handle keys of int64,string, for example */
/* map2[1000,"Cobalt"] */
#define KEY1_TYPE INT64
#define KEY2_TYPE STRING
#include "map-keys.c"
/* After defining all your key combinations, include map.c */
#include "map.c"
/* include if you use lists */
#include "list.c"
/* include if you use copy_from_user functions */
#include "copy.c"
/* include if you use the _stp_register_probe functions */
#include "probes.c"
MODULE_DESCRIPTION("SystemTap probe: myname");
MODULE_AUTHOR("Me <myname@nowhere.com>");
/* here is an example jprobe instrumentation function. */
/* jprobes require a prototype matching the probed function. */
static int inst_meminfo_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
_stp_print("Now in meminfo\n");
_stp_stack_printj();
_stp_ustack_print();
jprobe_return();
return 0;
}
/* here is an example kprobe. kprobes always take the same arguments */
static int inst_uptime_read_proc(struct kprobe *p, struct pt_regs *regs)
{
_stp_stack_print(regs);
_stp_ustack_print();
return 0;
}
/* put jprobes here */
static struct jprobe jp[] = {
{
.kp.addr = (kprobe_opcode_t *)"meminfo_read_proc",
.entry = (kprobe_opcode_t *) inst_meminfo_read_proc
},
};
/* put kprobes here */
static struct kprobe kp[] = {
{
.addr = "uptime_read_proc",
.pre_handler = inst_uptime_read_proc,
}
};
#define NUM_JPROBES (sizeof(jp)/sizeof(struct jprobe))
#define NUM_KPROBES (sizeof(kp)/sizeof(struct kprobe))
/* called when the module loads. */
int init_module(void)
{
int ret;
TRANSPORT_OPEN;
/* register any jprobes */
ret = _stp_register_jprobes (jp, NUM_JPROBES);
/* register any kprobes */
if (ret >= 0)
ret = _stp_register_kprobes (kp, NUM_KPROBES);
return ret;
}
static void probe_exit (void)
{
/* unregister the probes */
_stp_unregister_jprobes (jp, NUM_JPROBES);
_stp_unregister_kprobes (kp, NUM_KPROBES);
/* print out any colledted data, etc */
_stp_printf ("whatever I want to say\n");
_stp_print_flush();
}
/* required */
void cleanup_module(void)
{
_stp_transport_close();
}
MODULE_LICENSE("GPL");
|