में एक डीटीआर उपभोक्ता लिखना मैं फ्रीबीएसडी 10.1 पर एक सी प्रोग्राम लिखना चाहता हूं जो डीटी्रेस उपभोक्ताlibdtrace
का उपयोग कर लागू करता है।सी
मुझे पता है कि मुझे dtrace_open()
पर कॉल के साथ शुरू करने की आवश्यकता है - उदा। मुझे this पुरानी प्रस्तुति मिली है, लेकिन मैं भी शुरू नहीं कर सकता, क्योंकि dtrace.h
स्थापित नहीं है (केवल सिस्टम स्रोत पेड़ में)।
साझा लाइब्रेरी स्थापित है, उदा। /usr/sbin/dtrace
फ्रीबीएसडी के साथ शामिल टूल एक डीटीआरएस उपभोक्ता के रूप में कार्य कर सकता है और यह टूल /lib/libdtrace.so.2
से लिंक करता है (जिसे /usr/lib/libdtrace.so
से प्रतीकात्मक लिंक के माध्यम से भी इंगित किया जाता है)।
बिल्ड निर्देशों (फ्रीबीएसडी 10.1/क्लैंग) सहित कोई भी मूल उदाहरण मुझे बहुत मदद करेगा।
एक कस्टम उपभोक्ता एक CFFI आधारित आवरण अजगर और PyPy में प्रयोग करने योग्य पैदा कर रही है लेखन के वास्तविक लक्ष्य। मतलब: उपरोक्त सी प्रोग्राम शुरू करने के लिए है, सीखें और फिर आगे बढ़ें।
CFFI साझा पुस्तकालयों के साथ पीईपीई इंटरफेस करने की अनुशंसित, आधुनिक, उच्च-प्रदर्शन तरीका है।
CFFI ABI और API स्तर पर उपयोग किया जा सकता है। उत्तरार्द्ध को शामिल करने के लिए एक हेडर फ़ाइल की आवश्यकता होती है, पूर्व को lib से उपयोग की जाने वाली सामग्री घोषित करने की आवश्यकता होती है।
एडम जवाब से अनुकूलित, यहाँ एक पूरा उदाहरण है कि FreeBSD 10.1 पर काम करती है।
Makefile
:
all:
cc \
-I /usr/src/cddl/compat/opensolaris/include \
-I /usr/src/cddl/contrib/opensolaris/lib/libdtrace/common/ \
-I /usr/src/sys/cddl/compat/opensolaris \
-I /usr/src/sys/cddl/contrib/opensolaris/uts/common/ \
hello_dtrace.c \
-l dtrace -l proc -l ctf -l elf -l z -l rtld_db -l pthread -l util \
-o hello_dtrace
hello_dtrace.c
:
#include <dtrace.h>
#include <signal.h>
#include <stdio.h>
static dtrace_hdl_t* g_dtp;
static int chewrec (const dtrace_probedata_t *data, const dtrace_recdesc_t *rec, void *arg) {
printf("chewing dtrace record ..\n");
// A NULL rec indicates that we've processed the last record.
if (rec == NULL) {
return (DTRACE_CONSUME_NEXT);
}
return (DTRACE_CONSUME_THIS);
}
static const char* g_prog = "BEGIN { printf(\"hello from dtrace\\n\"); }";
//static const char* g_prog = "syscall::open*:entry { printf(\"%s %s\\n\", execname, copyinstr(arg0)); }";
static int g_intr;
static int g_exited;
static void intr (int signo) {
g_intr = 1;
}
int main (int argc, char** argv) {
int err;
if ((g_dtp = dtrace_open(DTRACE_VERSION, 0, &err)) == NULL) {
fprintf(stderr, "failed to initialize dtrace: %s\n", dtrace_errmsg(NULL, err));
return -1;
}
printf("Dtrace initialized\n");
(void) dtrace_setopt(g_dtp, "bufsize", "4m");
(void) dtrace_setopt(g_dtp, "aggsize", "4m");
printf("dtrace options set\n");
dtrace_prog_t* prog;
if ((prog = dtrace_program_strcompile(g_dtp, g_prog, DTRACE_PROBESPEC_NAME, 0, 0, NULL)) == NULL) {
fprintf(stderr, "failed to compile dtrace program\n");
return -1;
} else {
printf("dtrace program compiled\n");
}
dtrace_proginfo_t info;
if (dtrace_program_exec(g_dtp, prog, &info) == -1) {
fprintf(stderr, "failed to enable dtrace probes\n");
return -1;
} else {
printf("dtrace probes enabled\n");
}
struct sigaction act;
(void) sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = intr;
(void) sigaction(SIGINT, &act, NULL);
(void) sigaction(SIGTERM, &act, NULL);
if (dtrace_go(g_dtp) != 0) {
fprintf(stderr, "could not start instrumentation\n");
return -1;
} else {
printf("instrumentation started ..\n");
}
int done = 0;
do {
if (!g_intr && !done) {
dtrace_sleep(g_dtp);
}
if (done || g_intr || g_exited) {
done = 1;
if (dtrace_stop(g_dtp) == -1) {
fprintf(stderr, "could not stop tracing\n");
return -1;
}
}
switch (dtrace_work(g_dtp, stdout, NULL, chewrec, NULL)) {
case DTRACE_WORKSTATUS_DONE:
done = 1;
break;
case DTRACE_WORKSTATUS_OKAY:
break;
default:
fprintf(stderr, "processing aborted");
return -1;
}
} while (!done);
printf("closing dtrace\n");
dtrace_close(g_dtp);
return 0;
}
चलाने के लिए:
[[email protected] ~/hello_dtrace]$ make; sudo ./hello_dtrace
cc -I /usr/src/cddl/contrib/opensolaris/lib/libdtrace/common/ -I /usr/src/sys/cddl/compat/opensolaris -I /usr/src/sys/cddl/contrib/opensolaris/uts/common/ hello_dtrace.c -l dtrace -l proc -l ctf -l elf -l rtld_db -l z -l pthread -l util -o hello_dtrace
Dtrace initialized
dtrace options set
dtrace program compiled
dtrace probes enabled
instrumentation started ..
chewing dtrace record ..
hello from dtrace
chewing dtrace record ..
^Cclosing dtrace
सुनिश्चित नहीं हैं कि इस मदद करता है, लेकिन आप https://wiki.freebsd.org/DTrace की कोशिश कर सकते हैं। वहां कोड के उदाहरण हैं। – user590028
धन्यवाद, मैं इन पढ़ा है, लेकिन यह खुलासा नहीं करता है कैसे सी में एक कस्टम उपभोक्ता लिखने के लिए – oberstet
इतना पैडेंटिक होने के लिए खेद है, लेकिन क्या आपने उस साइट से https://wiki.freebsd.org/DTrace/KernelSupport पर लिंक भी पढ़ा था। अतिरिक्त 'मेक बिल्डवर्ल्ड' के लिए निर्देश हैं जो मुझे लगता है कि आप जिस समर्थन फ़ाइलों को ढूंढ रहे हैं उन्हें खींचेंगे। – user590028