ruby-static-tracing 0.0.12 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/ruby-static-tracing/lib/deps-extconf.rb +1 -1
- data/ext/ruby-static-tracing/lib/libstapsdt/Makefile +76 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/example/demo.c +42 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/asm/libstapsdt-x86_64.s +14 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/dynamic-symbols.c +41 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/dynamic-symbols.h +34 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/errors.c +30 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/errors.h +8 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/hash-table.c +27 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/hash-table.h +3 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/libstapsdt.c +258 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/libstapsdt.h +67 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/sdtnote.c +176 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/sdtnote.h +46 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/section.c +30 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/section.h +21 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/shared-lib.c +563 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/shared-lib.h +46 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/string-table.c +67 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/string-table.h +28 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/util.c +12 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/util.h +6 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/tests/test-errors.c +77 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/tests/test-memory-leaks.c +25 -0
- data/ext/ruby-static-tracing/lib/libusdt/Makefile +168 -0
- data/ext/ruby-static-tracing/lib/libusdt/test_mem_usage.c +77 -0
- data/ext/ruby-static-tracing/lib/libusdt/test_usdt.c +87 -0
- data/ext/ruby-static-tracing/lib/libusdt/usdt.c +321 -0
- data/ext/ruby-static-tracing/lib/libusdt/usdt.h +65 -0
- data/ext/ruby-static-tracing/lib/libusdt/usdt_dof.c +126 -0
- data/ext/ruby-static-tracing/lib/libusdt/usdt_dof_file.c +290 -0
- data/ext/ruby-static-tracing/lib/libusdt/usdt_dof_sections.c +180 -0
- data/ext/ruby-static-tracing/lib/libusdt/usdt_internal.h +107 -0
- data/ext/ruby-static-tracing/lib/libusdt/usdt_probe.c +133 -0
- data/ext/ruby-static-tracing/lib/libusdt/usdt_tracepoints_i386.s +69 -0
- data/ext/ruby-static-tracing/lib/libusdt/usdt_tracepoints_x86_64.s +123 -0
- data/lib/ruby-static-tracing/version.rb +1 -1
- metadata +38 -2
@@ -0,0 +1,46 @@
|
|
1
|
+
#ifndef _SHARED_LIB_H
|
2
|
+
#define _SHARED_LIB_H
|
3
|
+
|
4
|
+
#include "section.h"
|
5
|
+
#include "string-table.h"
|
6
|
+
#include "sdtnote.h"
|
7
|
+
#include "dynamic-symbols.h"
|
8
|
+
|
9
|
+
typedef struct {
|
10
|
+
Section
|
11
|
+
*hash,
|
12
|
+
*dynSym,
|
13
|
+
*dynStr,
|
14
|
+
*text,
|
15
|
+
*sdtBase,
|
16
|
+
*ehFrame,
|
17
|
+
*dynamic,
|
18
|
+
*sdtNote,
|
19
|
+
*shStrTab;
|
20
|
+
} SectionsList;
|
21
|
+
|
22
|
+
typedef struct {
|
23
|
+
Elf *elf;
|
24
|
+
Elf64_Ehdr *ehdr;
|
25
|
+
Elf64_Phdr *phdrLoad1, *phdrLoad2, *phdrDyn, *phdrStack;
|
26
|
+
|
27
|
+
StringTable *stringTable;
|
28
|
+
StringTable *dynamicString;
|
29
|
+
|
30
|
+
DynamicSymbolTable *dynamicSymbols;
|
31
|
+
|
32
|
+
SDTNoteList_t *sdtNotes;
|
33
|
+
size_t sdtNotesCount;
|
34
|
+
|
35
|
+
SectionsList sections;
|
36
|
+
} DynElf;
|
37
|
+
|
38
|
+
DynElf *dynElfInit();
|
39
|
+
|
40
|
+
int dynElfAddProbe(DynElf *dynElf, SDTProbe_t *probe);
|
41
|
+
|
42
|
+
int dynElfSave(DynElf *dynElf);
|
43
|
+
|
44
|
+
void dynElfClose(DynElf *dynElf);
|
45
|
+
|
46
|
+
#endif
|
@@ -0,0 +1,67 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <stdlib.h>
|
3
|
+
|
4
|
+
#include "string-table.h"
|
5
|
+
|
6
|
+
StringTable *stringTableInit() {
|
7
|
+
StringTable *stringTable = (StringTable *)calloc(sizeof(StringTable), 1);
|
8
|
+
stringTable->count = 1;
|
9
|
+
stringTable->size = 1;
|
10
|
+
|
11
|
+
stringTable->first = (StringTableNode *)calloc(sizeof(StringTableNode), 1);
|
12
|
+
|
13
|
+
stringTable->first->index = 0;
|
14
|
+
stringTable->first->size = 1;
|
15
|
+
stringTable->first->str = (char *)calloc(sizeof(char), 1);
|
16
|
+
stringTable->first->str[0] = '\0';
|
17
|
+
stringTable->first->next = NULL;
|
18
|
+
|
19
|
+
return stringTable;
|
20
|
+
}
|
21
|
+
|
22
|
+
StringTableNode *stringTableAdd(StringTable *stringTable, char *str) {
|
23
|
+
StringTableNode *current;
|
24
|
+
|
25
|
+
for (current = stringTable->first; current->next != NULL;
|
26
|
+
current = current->next) {
|
27
|
+
}
|
28
|
+
|
29
|
+
current->next = (StringTableNode *)calloc(sizeof(StringTableNode), 1);
|
30
|
+
current->next->index = current->index + current->size;
|
31
|
+
|
32
|
+
current = current->next;
|
33
|
+
current->size = strlen(str) + 1;
|
34
|
+
|
35
|
+
current->str = (char *)calloc(current->size, 1);
|
36
|
+
memcpy(current->str, str, current->size);
|
37
|
+
current->next = NULL;
|
38
|
+
|
39
|
+
stringTable->count += 1;
|
40
|
+
stringTable->size += current->size;
|
41
|
+
|
42
|
+
return current;
|
43
|
+
}
|
44
|
+
|
45
|
+
char *stringTableToBuffer(StringTable *stringTable) {
|
46
|
+
int offset;
|
47
|
+
StringTableNode *current;
|
48
|
+
char *buffer = (char *)calloc(stringTable->size, 1);
|
49
|
+
|
50
|
+
for (current = stringTable->first, offset = 0; current != NULL;
|
51
|
+
offset += current->size, current = current->next) {
|
52
|
+
memcpy(&buffer[offset], current->str, current->size);
|
53
|
+
}
|
54
|
+
|
55
|
+
return buffer;
|
56
|
+
}
|
57
|
+
|
58
|
+
void stringTableFree(StringTable *table) {
|
59
|
+
StringTableNode *node=NULL, *next=NULL;
|
60
|
+
for(node=table->first; node!=NULL; node=next) {
|
61
|
+
free(node->str);
|
62
|
+
|
63
|
+
next=node->next;
|
64
|
+
free(node);
|
65
|
+
}
|
66
|
+
free(table);
|
67
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#ifndef _STRING_TABLE_H
|
2
|
+
#define _STRING_TABLE_H
|
3
|
+
|
4
|
+
#include <stdlib.h>
|
5
|
+
#include <string.h>
|
6
|
+
|
7
|
+
typedef struct StringTableNode_ {
|
8
|
+
int index;
|
9
|
+
int size;
|
10
|
+
char *str;
|
11
|
+
struct StringTableNode_ *next;
|
12
|
+
} StringTableNode;
|
13
|
+
|
14
|
+
typedef struct {
|
15
|
+
int count;
|
16
|
+
size_t size;
|
17
|
+
StringTableNode *first;
|
18
|
+
} StringTable;
|
19
|
+
|
20
|
+
StringTable *stringTableInit();
|
21
|
+
|
22
|
+
StringTableNode *stringTableAdd(StringTable *stringTable, char *str);
|
23
|
+
|
24
|
+
char *stringTableToBuffer(StringTable *stringTable);
|
25
|
+
|
26
|
+
void stringTableFree(StringTable *stringTable);
|
27
|
+
|
28
|
+
#endif
|
@@ -0,0 +1,77 @@
|
|
1
|
+
#include "libstapsdt.h"
|
2
|
+
#include <stdio.h>
|
3
|
+
#include <unistd.h>
|
4
|
+
#include <dlfcn.h>
|
5
|
+
|
6
|
+
int testElfCreationError() {
|
7
|
+
// TODO (mmarchini) write test case for elf creation error
|
8
|
+
return 1;
|
9
|
+
}
|
10
|
+
|
11
|
+
int testTmpCreationError() {
|
12
|
+
SDTProvider_t *provider;
|
13
|
+
SDTError_t errno;
|
14
|
+
provider = providerInit("test/probe/creation/error");
|
15
|
+
if(providerLoad(provider) == 0) {
|
16
|
+
return 0;
|
17
|
+
}
|
18
|
+
printf("[testTmpCreationError] Error message: %s\n", provider->error);
|
19
|
+
errno = provider->errno;
|
20
|
+
providerDestroy(provider);
|
21
|
+
return errno == tmpCreationError;
|
22
|
+
}
|
23
|
+
|
24
|
+
int testSharedLibraryOpenError() {
|
25
|
+
// TODO (mmarchini) write test case for shared library loading error
|
26
|
+
return 1;
|
27
|
+
}
|
28
|
+
|
29
|
+
int testSymbolLoadingError() {
|
30
|
+
// TODO (mmarchini) write test case for symbol loading error
|
31
|
+
return 1;
|
32
|
+
}
|
33
|
+
|
34
|
+
int testSharedLibraryCloseError() {
|
35
|
+
SDTProvider_t *provider;
|
36
|
+
SDTError_t errno;
|
37
|
+
provider = providerInit("test-error");
|
38
|
+
providerLoad(provider);
|
39
|
+
dlclose(provider->_handle);
|
40
|
+
if(providerUnload(provider) == 0) {
|
41
|
+
return 0;
|
42
|
+
}
|
43
|
+
errno = provider->errno;
|
44
|
+
printf("[testSharedLibraryCloseError] Error message: %s\n", provider->error);
|
45
|
+
providerDestroy(provider);
|
46
|
+
return errno == sharedLibraryCloseError;
|
47
|
+
}
|
48
|
+
|
49
|
+
int main() {
|
50
|
+
if (!testElfCreationError()) {
|
51
|
+
printf("Test case failed: testElfCreationError\n");
|
52
|
+
return -1;
|
53
|
+
}
|
54
|
+
|
55
|
+
if (!testTmpCreationError()) {
|
56
|
+
printf("Test case failed: testTmpCreationError\n");
|
57
|
+
return -2;
|
58
|
+
}
|
59
|
+
|
60
|
+
if (!testSharedLibraryOpenError()) {
|
61
|
+
printf("Test case failed: testSharedLibraryOpenError\n");
|
62
|
+
return -3;
|
63
|
+
}
|
64
|
+
|
65
|
+
if (!testSymbolLoadingError()) {
|
66
|
+
printf("Test case failed: testSymbolLoadingError\n");
|
67
|
+
return -4;
|
68
|
+
}
|
69
|
+
|
70
|
+
if (!testSharedLibraryCloseError()) {
|
71
|
+
printf("Test case failed: testSharedLibraryCloseError\n");
|
72
|
+
return -5;
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
return 0;
|
77
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <unistd.h>
|
3
|
+
#include <libstapsdt.h>
|
4
|
+
|
5
|
+
int main( int argc, char *argv[] ) {
|
6
|
+
SDTProvider_t *provider;
|
7
|
+
SDTProbe_t *probe1, *probe2;
|
8
|
+
|
9
|
+
provider = providerInit("testProvider");
|
10
|
+
probe1 = providerAddProbe(provider, "testProbe1", 4, int8, uint8, int64, uint64);
|
11
|
+
probe2 = providerAddProbe(provider, "testProbe2", 2, int8, uint8);
|
12
|
+
|
13
|
+
if(providerLoad(provider) == -1) {
|
14
|
+
printf("Something went wrong...\n");
|
15
|
+
return -1;
|
16
|
+
}
|
17
|
+
|
18
|
+
probeFire(probe1, 1, 2, 3, 4);
|
19
|
+
probeFire(probe2, -3, 8);
|
20
|
+
|
21
|
+
providerUnload(provider);
|
22
|
+
providerDestroy(provider);
|
23
|
+
|
24
|
+
return 0;
|
25
|
+
}
|
@@ -0,0 +1,168 @@
|
|
1
|
+
CC = gcc
|
2
|
+
CFLAGS = -O2 -Wall
|
3
|
+
|
4
|
+
# MAC_BUILD - set this to "universal" to build a 2-way fat library
|
5
|
+
MAC_BUILD = universal
|
6
|
+
|
7
|
+
ARCH=x86_64
|
8
|
+
|
9
|
+
# if ARCH set, disable universal build on the mac
|
10
|
+
ifdef ARCH
|
11
|
+
MAC_BUILD =
|
12
|
+
else
|
13
|
+
ARCH = $(shell uname -m)
|
14
|
+
endif
|
15
|
+
|
16
|
+
UNAME = $(shell uname -s)
|
17
|
+
|
18
|
+
ifeq ($(UNAME), Linux)
|
19
|
+
RANLIB=ranlib
|
20
|
+
CFLAGS+=-D_GNU_SOURCE -fPIC
|
21
|
+
endif
|
22
|
+
|
23
|
+
ifeq ($(UNAME), SunOS)
|
24
|
+
RANLIB=/bin/true
|
25
|
+
PATH +=:/usr/perl5/5.10.0/bin:/usr/perl5/5.12/bin
|
26
|
+
CFLAGS += -fPIC
|
27
|
+
ifeq ($(ARCH), i86pc)
|
28
|
+
ARCH = $(shell isainfo -k)
|
29
|
+
ifeq ($(ARCH), amd64)
|
30
|
+
ARCH = x86_64
|
31
|
+
else
|
32
|
+
ARCH = i386
|
33
|
+
endif
|
34
|
+
endif
|
35
|
+
ifeq ($(ARCH), x86_64)
|
36
|
+
CFLAGS += -m64
|
37
|
+
else
|
38
|
+
CFLAGS += -m32
|
39
|
+
endif
|
40
|
+
endif
|
41
|
+
|
42
|
+
ifeq ($(UNAME), FreeBSD)
|
43
|
+
RANLIB=ranlib
|
44
|
+
CFLAGS += -Wno-error=unknown-pragmas -I/usr/src/sys/cddl/compat/opensolaris -I/usr/src/sys/cddl/contrib/opensolaris/uts/common
|
45
|
+
CFLAGS += -fPIC
|
46
|
+
ifeq ($(ARCH), i386)
|
47
|
+
CFLAGS += -m32
|
48
|
+
endif
|
49
|
+
ifeq ($(ARCH), amd64)
|
50
|
+
ARCH = x86_64
|
51
|
+
endif
|
52
|
+
endif
|
53
|
+
|
54
|
+
ifeq ($(UNAME), Darwin)
|
55
|
+
RANLIB=ranlib
|
56
|
+
ifeq ($(MAC_BUILD), universal)
|
57
|
+
CFLAGS += -arch i386 -arch x86_64
|
58
|
+
else
|
59
|
+
CFLAGS += -arch $(ARCH)
|
60
|
+
endif
|
61
|
+
endif
|
62
|
+
|
63
|
+
# main library build
|
64
|
+
objects = usdt.o usdt_dof_file.o usdt_tracepoints.o usdt_probe.o usdt_dof.o usdt_dof_sections.o
|
65
|
+
headers = usdt.h usdt_internal.h
|
66
|
+
|
67
|
+
.c.o: $(headers)
|
68
|
+
|
69
|
+
ifeq ($(UNAME), Darwin)
|
70
|
+
all: libusdt.a libusdt.dylib
|
71
|
+
else
|
72
|
+
all: libusdt.a
|
73
|
+
endif
|
74
|
+
|
75
|
+
libusdt.dylib: $(objects)
|
76
|
+
$(CC) $(CFLAGS) -dynamiclib -o $@ $^
|
77
|
+
|
78
|
+
libusdt.a: $(objects) $(headers)
|
79
|
+
rm -f libusdt.a
|
80
|
+
$(AR) cru libusdt.a $(objects)
|
81
|
+
$(RANLIB) libusdt.a
|
82
|
+
|
83
|
+
# Tracepoints build.
|
84
|
+
#
|
85
|
+
# If on Darwin and building a universal library, manually assemble a
|
86
|
+
# two-way fat object file from both the 32 and 64 bit tracepoint asm
|
87
|
+
# files.
|
88
|
+
#
|
89
|
+
# Otherwise, just choose the appropriate asm file based on the build
|
90
|
+
# architecture.
|
91
|
+
|
92
|
+
ifeq ($(UNAME), Darwin)
|
93
|
+
ifeq ($(MAC_BUILD), universal)
|
94
|
+
|
95
|
+
usdt_tracepoints_i386.o: usdt_tracepoints_i386.s
|
96
|
+
$(CC) -arch i386 -o usdt_tracepoints_i386.o -c usdt_tracepoints_i386.s
|
97
|
+
|
98
|
+
usdt_tracepoints_x86_64.o: usdt_tracepoints_x86_64.s
|
99
|
+
$(CC) -arch x86_64 -o usdt_tracepoints_x86_64.o -c usdt_tracepoints_x86_64.s
|
100
|
+
|
101
|
+
usdt_tracepoints.o: usdt_tracepoints_i386.o usdt_tracepoints_x86_64.o
|
102
|
+
lipo -create -output usdt_tracepoints.o usdt_tracepoints_i386.o \
|
103
|
+
usdt_tracepoints_x86_64.o
|
104
|
+
|
105
|
+
else # Darwin, not universal
|
106
|
+
usdt_tracepoints.o: usdt_tracepoints_$(ARCH).s
|
107
|
+
$(CC) -arch $(ARCH) -o usdt_tracepoints.o -c usdt_tracepoints_$(ARCH).s
|
108
|
+
endif
|
109
|
+
|
110
|
+
else # not Darwin; FreeBSD and Illumos
|
111
|
+
|
112
|
+
ifeq ($(ARCH), x86_64)
|
113
|
+
usdt_tracepoints.o: usdt_tracepoints_x86_64.s
|
114
|
+
$(CC) $(CFLAGS) -o usdt_tracepoints.o -c usdt_tracepoints_x86_64.s
|
115
|
+
endif
|
116
|
+
ifeq ($(ARCH), i386)
|
117
|
+
usdt_tracepoints.o: usdt_tracepoints_i386.s
|
118
|
+
$(CC) $(CFLAGS) -o usdt_tracepoints.o -c usdt_tracepoints_i386.s
|
119
|
+
endif
|
120
|
+
|
121
|
+
endif
|
122
|
+
|
123
|
+
clean:
|
124
|
+
rm -f *.gch
|
125
|
+
rm -f *.o
|
126
|
+
rm -f libusdt.a
|
127
|
+
rm -f libusdt.dylib
|
128
|
+
rm -f test_usdt
|
129
|
+
rm -f test_usdt32
|
130
|
+
rm -f test_usdt64
|
131
|
+
rm -f test_mem_usage
|
132
|
+
|
133
|
+
.PHONY: clean test
|
134
|
+
|
135
|
+
# testing
|
136
|
+
|
137
|
+
test_mem_usage: libusdt.a test_mem_usage.o
|
138
|
+
$(CC) $(CFLAGS) -o test_mem_usage test_mem_usage.o libusdt.a
|
139
|
+
|
140
|
+
ifeq ($(UNAME), Darwin)
|
141
|
+
ifeq ($(MAC_BUILD), universal)
|
142
|
+
test_usdt64: libusdt.a test_usdt.o
|
143
|
+
$(CC) -arch x86_64 -o test_usdt64 test_usdt.o libusdt.a
|
144
|
+
test_usdt32: libusdt.a test_usdt.o
|
145
|
+
$(CC) -arch i386 -o test_usdt32 test_usdt.o libusdt.a
|
146
|
+
else
|
147
|
+
test_usdt: libusdt.a test_usdt.o
|
148
|
+
$(CC) $(CFLAGS) -o test_usdt test_usdt.o libusdt.a
|
149
|
+
endif
|
150
|
+
else
|
151
|
+
test_usdt: libusdt.a test_usdt.o
|
152
|
+
$(CC) $(CFLAGS) -o test_usdt test_usdt.o libusdt.a
|
153
|
+
endif
|
154
|
+
|
155
|
+
ifeq ($(UNAME), Darwin)
|
156
|
+
ifeq ($(MAC_BUILD), universal)
|
157
|
+
test: test_usdt32 test_usdt64
|
158
|
+
sudo prove test.pl :: 64
|
159
|
+
sudo prove test.pl :: 32
|
160
|
+
else
|
161
|
+
test: test_usdt
|
162
|
+
sudo prove test.pl
|
163
|
+
endif
|
164
|
+
else
|
165
|
+
test: test_usdt
|
166
|
+
sudo prove test.pl
|
167
|
+
endif
|
168
|
+
|
@@ -0,0 +1,77 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2012, Chris Andrews. All rights reserved.
|
3
|
+
*/
|
4
|
+
|
5
|
+
#include "usdt.h"
|
6
|
+
|
7
|
+
#include <stdio.h>
|
8
|
+
#include <stdlib.h>
|
9
|
+
#include <string.h>
|
10
|
+
|
11
|
+
static void
|
12
|
+
create_and_free_provider(int argc, char **argv)
|
13
|
+
{
|
14
|
+
usdt_provider_t *provider;
|
15
|
+
usdt_probedef_t *probedef;
|
16
|
+
|
17
|
+
if ((provider = usdt_create_provider("testlibusdt", "modname")) == NULL) {
|
18
|
+
fprintf(stderr, "unable to create provider\n");
|
19
|
+
exit (1);
|
20
|
+
}
|
21
|
+
if ((probedef = usdt_create_probe((const char *)argv[1],
|
22
|
+
(const char *)argv[2],
|
23
|
+
(argc-3), (const char **)&argv[3])) == NULL)
|
24
|
+
{
|
25
|
+
fprintf(stderr, "unable to create probe\n");
|
26
|
+
exit (1);
|
27
|
+
}
|
28
|
+
usdt_provider_add_probe(provider, probedef);
|
29
|
+
|
30
|
+
if ((usdt_provider_enable(provider)) < 0) {
|
31
|
+
fprintf(stderr, "unable to enable provider: %s\n", usdt_errstr(provider));
|
32
|
+
exit (1);
|
33
|
+
}
|
34
|
+
|
35
|
+
if ((usdt_provider_disable(provider)) < 0) {
|
36
|
+
fprintf(stderr, "unable to disable provider: %s\n", usdt_errstr(provider));
|
37
|
+
exit (1);
|
38
|
+
}
|
39
|
+
|
40
|
+
usdt_probe_release(probedef);
|
41
|
+
usdt_provider_free(provider);
|
42
|
+
}
|
43
|
+
|
44
|
+
int
|
45
|
+
main(int argc, char **argv)
|
46
|
+
{
|
47
|
+
char char_argv[USDT_ARG_MAX];
|
48
|
+
int int_argv[USDT_ARG_MAX * 2];
|
49
|
+
int i;
|
50
|
+
char buf[255];
|
51
|
+
|
52
|
+
for (i = 0; i < USDT_ARG_MAX; i++)
|
53
|
+
int_argv[i] = i + 1;
|
54
|
+
for (i = 0; i < USDT_ARG_MAX; i++)
|
55
|
+
char_argv[i] = (char) i + 65;
|
56
|
+
|
57
|
+
if (argc < 3) {
|
58
|
+
fprintf(stderr, "usage: %s func name [types ...]\n", argv[0]);
|
59
|
+
return(1);
|
60
|
+
}
|
61
|
+
|
62
|
+
for (i = 0; i < USDT_ARG_MAX; i++) {
|
63
|
+
if (argv[i+3] != NULL && i+3 < argc) {
|
64
|
+
if (strncmp("c", argv[i+3], 1) == 0) {
|
65
|
+
argv[i+3] = strdup("char *");
|
66
|
+
}
|
67
|
+
if (strncmp("i", argv[i+3], 1) == 0) {
|
68
|
+
argv[i+3] = strdup("int");
|
69
|
+
}
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
for (i = 0; i < 100000; i++)
|
74
|
+
create_and_free_provider(argc, argv);
|
75
|
+
|
76
|
+
return 0;
|
77
|
+
}
|