File: apitrace.d

package info (click to toggle)
db5.3 5.3.28%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 158,500 kB
  • sloc: ansic: 448,411; java: 111,824; tcl: 80,544; sh: 44,264; cs: 33,697; cpp: 21,604; perl: 14,557; xml: 10,799; makefile: 4,077; javascript: 1,998; yacc: 1,003; awk: 965; sql: 801; erlang: 342; python: 216; php: 24; asm: 14
file content (65 lines) | stat: -rwxr-xr-x 1,730 bytes parent folder | download | duplicates (9)
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
#!/usr/sbin/dtrace -s
/*
 * Copyright (c) 2011, 2013 Oracle and/or its affiliates.  All rights reserved.
 * 
 * apitrace.d - Trace the primary BDB API calls
 *
 * This script displays the entry to and return from each of the main API calls.
 *
 * The optional integer maxcount parameter directs the script to exit once that
 * many functions have been displayed.
 *
 * On a multiprocessor or multicore machine it is possible to see results which
 * are slightly out of order when a thread changes switches to another cpu.
 * The output can be sent through "sort -t@ -k2n" to order the lines by time.
 *
 * usage: apitrace.d { -p <pid> | -c "<program> [<args]" } [maxcount]
 *
 */
#pragma D option quiet
#pragma D option flowindent
#pragma D option bufsize=8m
#pragma D option defaultargs

int eventcount;
int maxcount;
unsigned long long epoch;

self unsigned long long start;
this unsigned long long now;
this unsigned long long duration;

dtrace:::BEGIN
{
	eventcount = 0;
	maxcount = $1 != 0 ? $1 : -1;
	epoch = timestamp;
	printf("DB API call trace of process %d\n", $target);
	printf("Interrupt to display summary\n");
}

pid$target::db_*create:entry,
pid$target::__*_pp:entry
{
	self->start = timestamp;
	printf("called with (%x, %x, %x...) @ %u\n", arg0, arg1, arg2, self->start - epoch);
}

pid$target::db_*create:return,
pid$target::__*_pp:return
/self->start != 0/
{
	this->now = timestamp;
	this->duration = this->now - self->start;
	self->start = 0;
	eventcount++;
	printf("returns %d after %d ns @ %u\n", arg1, this->duration, this->now - epoch);
}

pid$target::db_*create:return,
pid$target::__*_pp:return
/eventcount == maxcount/
{
	printf("Exiting %s:%s count %d\n", probefunc, probename, eventcount);
	exit(0);
}