aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn-Egil Dahlberg <[email protected]>2016-03-02 16:46:04 +0100
committerBjörn-Egil Dahlberg <[email protected]>2016-04-29 18:31:34 +0200
commitb36c6d949916e1d7b0f6bee17004c012e6a36112 (patch)
tree4303ddf553e5b4742fa850e409f0b71e9437e7ac
parent8b9b4e8bffe087752463287457330803e69a1c81 (diff)
downloadotp-b36c6d949916e1d7b0f6bee17004c012e6a36112.tar.gz
otp-b36c6d949916e1d7b0f6bee17004c012e6a36112.tar.bz2
otp-b36c6d949916e1d7b0f6bee17004c012e6a36112.zip
runtime_tools: Add lttng 'running' tracing
-rw-r--r--lib/runtime_tools/c_src/dyntrace.c60
-rw-r--r--lib/runtime_tools/c_src/dyntrace_lttng.h17
-rw-r--r--lib/runtime_tools/src/dyntrace.erl5
3 files changed, 78 insertions, 4 deletions
diff --git a/lib/runtime_tools/c_src/dyntrace.c b/lib/runtime_tools/c_src/dyntrace.c
index 3da003f281..4abe4f80ac 100644
--- a/lib/runtime_tools/c_src/dyntrace.c
+++ b/lib/runtime_tools/c_src/dyntrace.c
@@ -69,6 +69,7 @@ static ERL_NIF_TERM user_trace_n(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
static ERL_NIF_TERM enabled(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM trace(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM trace_procs(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
+static ERL_NIF_TERM trace_running(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM trace_send(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM trace_receive(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
static ERL_NIF_TERM trace_garbage_collection(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
@@ -82,6 +83,7 @@ static ErlNifFunc nif_funcs[] = {
{"trace", 5, trace},
{"trace", 6, trace},
{"trace_procs", 6, trace_procs},
+ {"trace_running", 6, trace_running},
{"trace_send", 6, trace_send},
{"trace_receive", 6, trace_receive},
{"trace_garbage_collection", 6, trace_garbage_collection}
@@ -105,7 +107,7 @@ static ERL_NIF_TERM atom_discard;
static ERL_NIF_TERM atom_gc_start;
static ERL_NIF_TERM atom_gc_end;
-/* process atoms */
+/* process 'procs' */
static ERL_NIF_TERM atom_spawn;
static ERL_NIF_TERM atom_exit;
@@ -116,6 +118,14 @@ static ERL_NIF_TERM atom_unlink;
static ERL_NIF_TERM atom_getting_linked;
static ERL_NIF_TERM atom_getting_unlinked;
+/* process 'running' and 'exiting' */
+
+static ERL_NIF_TERM atom_in;
+static ERL_NIF_TERM atom_out;
+static ERL_NIF_TERM atom_in_exiting;
+static ERL_NIF_TERM atom_out_exiting;
+static ERL_NIF_TERM atom_out_exited;
+
static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
{
@@ -146,6 +156,14 @@ static int load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM load_info)
atom_getting_unlinked = enif_make_atom(env,"getting_unlinked");
atom_getting_linked = enif_make_atom(env,"getting_linked");
+ /* process 'running' and 'exiting' */
+
+ atom_in = enif_make_atom(env,"in");
+ atom_out = enif_make_atom(env,"out");
+ atom_in_exiting = enif_make_atom(env,"in_exiting");
+ atom_out_exiting = enif_make_atom(env,"out_exiting");
+ atom_out_exited = enif_make_atom(env,"out_exited");
+
return 0;
}
@@ -326,7 +344,7 @@ static ERL_NIF_TERM trace_receive(ErlNifEnv* env, int argc, const ERL_NIF_TERM a
}
#elif HAVE_USE_LTTNG
int i;
- erts_fprintf(stderr, "trace:\r\n");
+ erts_fprintf(stderr, "receive trace:\r\n");
for (i = 0; i < argc; i++) {
erts_fprintf(stderr, " %T\r\n", argv[i]);
}
@@ -466,7 +484,6 @@ static ERL_NIF_TERM trace_procs(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
} else if (argv[0] == atom_link) {
lttng_pid_to_str(argv[3], to);
LTTNG3(process_link, pid, to, "link");
- /* link */
} else if (argv[0] == atom_unlink) {
lttng_pid_to_str(argv[3], to);
LTTNG3(process_link, pid, to, "unlink");
@@ -483,7 +500,7 @@ static ERL_NIF_TERM trace_procs(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
LTTNG2(process_exit, pid, reason);
} else {
int i;
- erts_fprintf(stderr, "trace:\r\n");
+ erts_fprintf(stderr, "proc trace:\r\n");
for (i = 0; i < argc; i++) {
erts_fprintf(stderr, " %T\r\n", argv[i]);
}
@@ -492,3 +509,38 @@ static ERL_NIF_TERM trace_procs(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
return atom_ok;
}
+static ERL_NIF_TERM trace_running(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+#ifdef HAVE_USE_DTRACE
+#elif HAVE_USE_LTTNG
+ lttng_decl_procbuf(pid);
+ const ERL_NIF_TERM* tuple;
+ char *mfastr = "undefined";
+ int arity;
+
+ lttng_pid_to_str(argv[2], pid);
+ lttng_decl_mfabuf(mfa);
+
+ if (enif_get_tuple(env, argv[3], &arity, &tuple)) {
+ int val;
+ enif_get_int(env, tuple[2], &val);
+ lttng_mfa_to_str(tuple[0], tuple[1], val, mfa);
+ mfastr = mfa;
+ }
+
+ /* running */
+ if (argv[0] == atom_in) {
+ LTTNG3(process_scheduled, pid, mfastr, "in");
+ } else if (argv[0] == atom_out) {
+ LTTNG3(process_scheduled, pid, mfastr, "out");
+ /* exiting */
+ } else if (argv[0] == atom_in_exiting) {
+ LTTNG3(process_scheduled, pid, mfastr, "in_exiting");
+ } else if (argv[0] == atom_out_exiting) {
+ LTTNG3(process_scheduled, pid, mfastr, "out_exiting");
+ } else if (argv[0] == atom_out_exited) {
+ LTTNG3(process_scheduled, pid, mfastr, "out_exited");
+ }
+#endif
+ return atom_ok;
+}
diff --git a/lib/runtime_tools/c_src/dyntrace_lttng.h b/lib/runtime_tools/c_src/dyntrace_lttng.h
index c2fd003d48..1271f7516a 100644
--- a/lib/runtime_tools/c_src/dyntrace_lttng.h
+++ b/lib/runtime_tools/c_src/dyntrace_lttng.h
@@ -130,6 +130,23 @@ TRACEPOINT_EVENT(
)
)
+/* Scheduled */
+
+TRACEPOINT_EVENT(
+ com_ericsson_dyntrace,
+ process_scheduled,
+ TP_ARGS(
+ char*, p,
+ char*, mfa,
+ char*, type
+ ),
+ TP_FIELDS(
+ ctf_string(pid, p)
+ ctf_string(entry, mfa)
+ ctf_string(type, type)
+ )
+)
+
/* Process Memory */
TRACEPOINT_EVENT(
diff --git a/lib/runtime_tools/src/dyntrace.erl b/lib/runtime_tools/src/dyntrace.erl
index 6822f51549..aef4d9fab0 100644
--- a/lib/runtime_tools/src/dyntrace.erl
+++ b/lib/runtime_tools/src/dyntrace.erl
@@ -45,6 +45,7 @@
trace/5,
trace/6,
trace_procs/6,
+ trace_running/6,
trace_send/6,
trace_receive/6,
trace_garbage_collection/6
@@ -145,6 +146,10 @@ trace(_TraceTag, _TracerState, _Tracee, _FirstTraceTerm, _SecondTraceTerm, _Opts
trace_procs(_TraceTag, _TracerState, _Tracee, _FirstTraceTerm, _SecondTraceTerm, _Opts) ->
erlang:nif_error(nif_not_loaded).
+
+trace_running(_TraceTag, _TracerState, _Tracee, _FirstTraceTerm, _SecondTraceTerm, _Opts) ->
+ erlang:nif_error(nif_not_loaded).
+
trace_send(_TraceTag, _TracerState, _Tracee, _FirstTraceTerm, _SecondTraceTerm, _Opts) ->
erlang:nif_error(nif_not_loaded).
trace_receive(_TraceTag, _TracerState, _Tracee, _FirstTraceTerm, _SecondTraceTerm, _Opts) ->