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
|
/* 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 probe_start(void)
{
/* initialize any data or variables */
/* register any jprobes */
int ret = _stp_register_jprobes (jp, NUM_JPROBES);
/* Register any kprobes and jprobes. */
/* You probably only have one type */
if (ret >= 0)
if ((ret = _stp_register_kprobes (kp, NUM_KPROBES)) < 0)
_stp_unregister_jprobes (jp, NUM_JPROBES);
return ret;
}
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();
}
|