1*287e80b3SSadaf Ebrahimilibtracefs(3) 2*287e80b3SSadaf Ebrahimi============= 3*287e80b3SSadaf Ebrahimi 4*287e80b3SSadaf EbrahimiNAME 5*287e80b3SSadaf Ebrahimi---- 6*287e80b3SSadaf Ebrahimitracefs_uprobe_alloc,tracefs_uretprobe_alloc - Allocate new user (return) probe 7*287e80b3SSadaf Ebrahimi 8*287e80b3SSadaf EbrahimiSYNOPSIS 9*287e80b3SSadaf Ebrahimi-------- 10*287e80b3SSadaf Ebrahimi[verse] 11*287e80b3SSadaf Ebrahimi-- 12*287e80b3SSadaf Ebrahimi*#include <tracefs.h>* 13*287e80b3SSadaf Ebrahimi 14*287e80b3SSadaf Ebrahimistruct tracefs_dynevent pass:[*] 15*287e80b3SSadaf Ebrahimi*tracefs_uprobe_alloc*(const char pass:[*]_system_, const char pass:[*]_event_, 16*287e80b3SSadaf Ebrahimi const char pass:[*]_file_, unsigned long long _offset_, const char pass:[*]_fetchargs_) 17*287e80b3SSadaf Ebrahimistruct tracefs_dynevent pass:[*] 18*287e80b3SSadaf Ebrahimi*tracefs_uretprobe_alloc*(const char pass:[*]_system_, const char pass:[*]_event_, 19*287e80b3SSadaf Ebrahimi const char pass:[*]_file_, unsigned long long _offset_, const char pass:[*]_fetchargs_) 20*287e80b3SSadaf Ebrahimi-- 21*287e80b3SSadaf Ebrahimi 22*287e80b3SSadaf EbrahimiDESCRIPTION 23*287e80b3SSadaf Ebrahimi----------- 24*287e80b3SSadaf Ebrahimi*tracefs_uprobe_alloc*() allocates a new uprobe context. It will be in the _system_ group 25*287e80b3SSadaf Ebrahimi(or uprobes if _system_ is NULL) and with _event_ name. The uprobe will be attached to _offset_ 26*287e80b3SSadaf Ebrahimiwithin the _file_. The list of arguments, described in _fetchargs_, will be fetched with the uprobe. 27*287e80b3SSadaf EbrahimiThe returned pointer to the user probe context must be freed with *tracefs_dynevent_free*(). 28*287e80b3SSadaf EbrahimiThe ubrobe is not configured in the system, tracefs_dynevent_* set of APIs can be used to configure 29*287e80b3SSadaf Ebrahimiit. 30*287e80b3SSadaf Ebrahimi 31*287e80b3SSadaf EbrahimiThe *tracefs_uretprobe_alloc*() behaves the same as *tracefs_uprobe_alloc*(), the only difference is 32*287e80b3SSadaf Ebrahimithat it allocates context to user return probe (uretprobe). 33*287e80b3SSadaf Ebrahimi 34*287e80b3SSadaf EbrahimiRETURN VALUE 35*287e80b3SSadaf Ebrahimi------------ 36*287e80b3SSadaf EbrahimiThe *tracefs_uprobe_alloc*() and *tracefs_uretprobe_alloc*() APIs return a pointer to an allocated 37*287e80b3SSadaf Ebrahimitracefs_dynevent structure, describing the user probe. This pointer must be freed with 38*287e80b3SSadaf Ebrahimi*tracefs_dynevent_free*(3). Note, this only allocates a descriptor representing the uprobe. It does 39*287e80b3SSadaf Ebrahiminot modify the running system. On error NULL is returned. 40*287e80b3SSadaf Ebrahimi 41*287e80b3SSadaf EbrahimiEXAMPLE 42*287e80b3SSadaf Ebrahimi------- 43*287e80b3SSadaf Ebrahimi[source,c] 44*287e80b3SSadaf Ebrahimi-- 45*287e80b3SSadaf Ebrahimi 46*287e80b3SSadaf Ebrahimi#include <stdlib.h> 47*287e80b3SSadaf Ebrahimi#include <unistd.h> 48*287e80b3SSadaf Ebrahimi#include <sys/wait.h> 49*287e80b3SSadaf Ebrahimi 50*287e80b3SSadaf Ebrahimi#include <tracefs.h> 51*287e80b3SSadaf Ebrahimi 52*287e80b3SSadaf Ebrahimistatic int callback(struct tep_event *event, struct tep_record *record, 53*287e80b3SSadaf Ebrahimi int cpu, void *data) 54*287e80b3SSadaf Ebrahimi{ 55*287e80b3SSadaf Ebrahimi struct trace_seq seq; 56*287e80b3SSadaf Ebrahimi 57*287e80b3SSadaf Ebrahimi trace_seq_init(&seq); 58*287e80b3SSadaf Ebrahimi tep_print_event(event->tep, &seq, record, "%d-%s: %s", 59*287e80b3SSadaf Ebrahimi TEP_PRINT_PID, TEP_PRINT_COMM, TEP_PRINT_NAME); 60*287e80b3SSadaf Ebrahimi trace_seq_puts(&seq, "'\n"); 61*287e80b3SSadaf Ebrahimi 62*287e80b3SSadaf Ebrahimi trace_seq_terminate(&seq); 63*287e80b3SSadaf Ebrahimi trace_seq_do_printf(&seq); 64*287e80b3SSadaf Ebrahimi trace_seq_destroy(&seq); 65*287e80b3SSadaf Ebrahimi 66*287e80b3SSadaf Ebrahimi return 0; 67*287e80b3SSadaf Ebrahimi} 68*287e80b3SSadaf Ebrahimi 69*287e80b3SSadaf Ebrahimistatic pid_t run_exec(char **argv, char **env) 70*287e80b3SSadaf Ebrahimi{ 71*287e80b3SSadaf Ebrahimi pid_t pid; 72*287e80b3SSadaf Ebrahimi 73*287e80b3SSadaf Ebrahimi pid = fork(); 74*287e80b3SSadaf Ebrahimi if (pid) 75*287e80b3SSadaf Ebrahimi return pid; 76*287e80b3SSadaf Ebrahimi 77*287e80b3SSadaf Ebrahimi execve(argv[0], argv, env); 78*287e80b3SSadaf Ebrahimi perror("exec"); 79*287e80b3SSadaf Ebrahimi exit(-1); 80*287e80b3SSadaf Ebrahimi} 81*287e80b3SSadaf Ebrahimi 82*287e80b3SSadaf Ebrahimiconst char *myprobe = "my_urobes"; 83*287e80b3SSadaf Ebrahimi 84*287e80b3SSadaf Ebrahimiint main (int argc, char **argv, char **env) 85*287e80b3SSadaf Ebrahimi{ 86*287e80b3SSadaf Ebrahimi struct tracefs_dynevent *uprobe, *uretprobe; 87*287e80b3SSadaf Ebrahimi struct tep_handle *tep; 88*287e80b3SSadaf Ebrahimi struct tracefs_instance *instance; 89*287e80b3SSadaf Ebrahimi const char *sysnames[] = { myprobe, NULL }; 90*287e80b3SSadaf Ebrahimi long addr; 91*287e80b3SSadaf Ebrahimi pid_t pid; 92*287e80b3SSadaf Ebrahimi 93*287e80b3SSadaf Ebrahimi if (argc < 3) { 94*287e80b3SSadaf Ebrahimi printf("usage: %s file_offset command\n", argv[0]); 95*287e80b3SSadaf Ebrahimi exit(-1); 96*287e80b3SSadaf Ebrahimi } 97*287e80b3SSadaf Ebrahimi addr = strtol(argv[1], NULL, 0); 98*287e80b3SSadaf Ebrahimi 99*287e80b3SSadaf Ebrahimi instance = tracefs_instance_create("exec_open"); 100*287e80b3SSadaf Ebrahimi if (!instance) { 101*287e80b3SSadaf Ebrahimi perror("creating instance"); 102*287e80b3SSadaf Ebrahimi exit(-1); 103*287e80b3SSadaf Ebrahimi } 104*287e80b3SSadaf Ebrahimi 105*287e80b3SSadaf Ebrahimi tracefs_dynevent_destroy_all(TRACEFS_DYNEVENT_UPROBE|TRACEFS_DYNEVENT_URETPROBE, true); 106*287e80b3SSadaf Ebrahimi 107*287e80b3SSadaf Ebrahimi uprobe = tracefs_uprobe_alloc(myprobe, "user_probe", argv[2], addr, NULL); 108*287e80b3SSadaf Ebrahimi uretprobe = tracefs_uretprobe_alloc(myprobe, "user_retprobe", argv[2], addr, NULL); 109*287e80b3SSadaf Ebrahimi if (!uprobe || !uretprobe) { 110*287e80b3SSadaf Ebrahimi perror("allocating user probes"); 111*287e80b3SSadaf Ebrahimi exit(-1); 112*287e80b3SSadaf Ebrahimi } 113*287e80b3SSadaf Ebrahimi 114*287e80b3SSadaf Ebrahimi if (tracefs_dynevent_create(uprobe) || 115*287e80b3SSadaf Ebrahimi tracefs_dynevent_create(uretprobe)) { 116*287e80b3SSadaf Ebrahimi perror("creating user probes"); 117*287e80b3SSadaf Ebrahimi exit(-1); 118*287e80b3SSadaf Ebrahimi } 119*287e80b3SSadaf Ebrahimi 120*287e80b3SSadaf Ebrahimi tep = tracefs_local_events_system(NULL, sysnames); 121*287e80b3SSadaf Ebrahimi if (!tep) { 122*287e80b3SSadaf Ebrahimi perror("reading events"); 123*287e80b3SSadaf Ebrahimi exit(-1); 124*287e80b3SSadaf Ebrahimi } 125*287e80b3SSadaf Ebrahimi 126*287e80b3SSadaf Ebrahimi tracefs_event_enable(instance, myprobe, "user_probe"); 127*287e80b3SSadaf Ebrahimi tracefs_event_enable(instance, myprobe, "user_retprobe"); 128*287e80b3SSadaf Ebrahimi 129*287e80b3SSadaf Ebrahimi pid = run_exec(&argv[2], env); 130*287e80b3SSadaf Ebrahimi 131*287e80b3SSadaf Ebrahimi /* Let the child start to run */ 132*287e80b3SSadaf Ebrahimi sched_yield(); 133*287e80b3SSadaf Ebrahimi 134*287e80b3SSadaf Ebrahimi do { 135*287e80b3SSadaf Ebrahimi tracefs_load_cmdlines(NULL, tep); 136*287e80b3SSadaf Ebrahimi tracefs_iterate_raw_events(tep, instance, NULL, 0, callback, NULL); 137*287e80b3SSadaf Ebrahimi } while (waitpid(pid, NULL, WNOHANG) != pid); 138*287e80b3SSadaf Ebrahimi 139*287e80b3SSadaf Ebrahimi /* disable and destroy the events */ 140*287e80b3SSadaf Ebrahimi tracefs_dynevent_destroy(uprobe, true); 141*287e80b3SSadaf Ebrahimi tracefs_dynevent_destroy(uretprobe, true); 142*287e80b3SSadaf Ebrahimi tracefs_dynevent_free(uprobe); 143*287e80b3SSadaf Ebrahimi tracefs_dynevent_free(uretprobe); 144*287e80b3SSadaf Ebrahimi tracefs_instance_destroy(instance); 145*287e80b3SSadaf Ebrahimi 146*287e80b3SSadaf Ebrahimi return 0; 147*287e80b3SSadaf Ebrahimi} 148*287e80b3SSadaf Ebrahimi-- 149*287e80b3SSadaf Ebrahimi 150*287e80b3SSadaf EbrahimiFILES 151*287e80b3SSadaf Ebrahimi----- 152*287e80b3SSadaf Ebrahimi[verse] 153*287e80b3SSadaf Ebrahimi-- 154*287e80b3SSadaf Ebrahimi*tracefs.h* 155*287e80b3SSadaf Ebrahimi Header file to include in order to have access to the library APIs. 156*287e80b3SSadaf Ebrahimi*-ltracefs* 157*287e80b3SSadaf Ebrahimi Linker switch to add when building a program that uses the library. 158*287e80b3SSadaf Ebrahimi-- 159*287e80b3SSadaf Ebrahimi 160*287e80b3SSadaf EbrahimiSEE ALSO 161*287e80b3SSadaf Ebrahimi-------- 162*287e80b3SSadaf Ebrahimi*libtracefs*(3), 163*287e80b3SSadaf Ebrahimi*libtraceevent*(3), 164*287e80b3SSadaf Ebrahimi*trace-cmd*(1) 165*287e80b3SSadaf Ebrahimi 166*287e80b3SSadaf EbrahimiAUTHOR 167*287e80b3SSadaf Ebrahimi------ 168*287e80b3SSadaf Ebrahimi[verse] 169*287e80b3SSadaf Ebrahimi-- 170*287e80b3SSadaf Ebrahimi*Steven Rostedt* <[email protected]> 171*287e80b3SSadaf Ebrahimi*Tzvetomir Stoyanov* <[email protected]> 172*287e80b3SSadaf Ebrahimi-- 173*287e80b3SSadaf Ebrahimi 174*287e80b3SSadaf EbrahimiREPORTING BUGS 175*287e80b3SSadaf Ebrahimi-------------- 176*287e80b3SSadaf EbrahimiReport bugs to <[email protected]> 177*287e80b3SSadaf Ebrahimi 178*287e80b3SSadaf EbrahimiLICENSE 179*287e80b3SSadaf Ebrahimi------- 180*287e80b3SSadaf Ebrahimilibtracefs is Free Software licensed under the GNU LGPL 2.1 181*287e80b3SSadaf Ebrahimi 182*287e80b3SSadaf EbrahimiRESOURCES 183*287e80b3SSadaf Ebrahimi--------- 184*287e80b3SSadaf Ebrahimihttps://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/ 185*287e80b3SSadaf Ebrahimi 186*287e80b3SSadaf EbrahimiCOPYING 187*287e80b3SSadaf Ebrahimi------- 188*287e80b3SSadaf EbrahimiCopyright \(C) 2022 VMware, Inc. Free use of this software is granted under 189*287e80b3SSadaf Ebrahimithe terms of the GNU Public License (GPL). 190