# libust and '.' (that contains the linker script). However, '.'
# must be installed after libust so it can overwrite libust.so with
# the linker script.
-SUBDIRS = snprintf libustcomm libustctl libust . tests libustinstr-malloc libustconsumer ust-consumerd ustctl libustfork include doc
+SUBDIRS = snprintf libust . tests libustinstr-malloc libustfork include doc
EXTRA_DIST = libust.ldscript.in libust-initializer.c libust-initializer.h
-dist_bin_SCRIPTS = usttrace
ldscriptsdir = $(libdir)
ldscripts_DATA = libust.so libust-initializer.o
$(CC) $(CFLAGS) -fno-strict-aliasing -fPIC -c -I$(top_srcdir)/include -I$(top_srcdir) -o $@ $<
pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = ust.pc
\ No newline at end of file
+pkgconfig_DATA = ust.pc
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
-AC_INIT([ust], [0.14], [mathieu dot desnoyers at efficios dot com])
+AC_INIT([ust], [1.9.0], [mathieu dot desnoyers at efficios dot com])
AC_CONFIG_AUX_DIR([config])
AC_CANONICAL_TARGET
AC_CANONICAL_HOST
AC_PROG_LIBTOOL
## Checks for libraries.
-## FIXME: Replace `main' with a function in `-ldl':
-#AC_CHECK_LIB([dl], [main])
-## FIXME: Replace `main' with a function in `-lmarkers':
-#AC_CHECK_LIB([markers], [main])
-## FIXME: Replace `main' with a function in `-lpthread':
-#AC_CHECK_LIB([pthread], [main])
-## FIXME: Replace `main' with a function in `-ltracectl':
-#AC_CHECK_LIB([tracectl], [main])
-## FIXME: Replace `main' with a function in `-ltracing':
-#AC_CHECK_LIB([tracing], [main])
-## FIXME: Replace `main' with a function in `-lurcu':
-#AC_CHECK_LIB([urcu], [main])
+AC_CHECK_LIB([dl], [dlopen])
+AC_CHECK_LIB([pthread], [pthread_create])
# Checks for header files.
#AC_CHECK_HEADERS([fcntl.h stdint.h stdlib.h string.h sys/socket.h sys/time.h unistd.h])
tests/exit-fast/Makefile
libustinstr-malloc/Makefile
libustfork/Makefile
- libustconsumer/Makefile
- ust-consumerd/Makefile
- ustctl/Makefile
- libustcomm/Makefile
- libustctl/Makefile
snprintf/Makefile
ust.pc
include/ust/version.h
--- /dev/null
+/*
+ * libustconsumer header file
+ *
+ * Copyright 2005-2010 -
+ * Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+ * Copyright 2010-
+ * Oumarou Dicko <oumarou.dicko@polymtl.ca>
+ * Michael Sills-Lavoie <michael.sills-lavoie@polymtl.ca>
+ * Alexis Halle <alexis.halle@polymtl.ca>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _USTCONSUMER_H
+#define _USTCONSUMER_H
+
+#include <pthread.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <urcu/list.h>
+
+#define USTCONSUMER_DEFAULT_TRACE_PATH "/tmp/usttrace"
+
+struct ustcomm_sock;
+
+struct buffer_info {
+ char *name;
+ char *trace;
+ char *channel;
+ int channel_cpu;
+
+ pid_t pid;
+ int app_sock;
+ /* The pipe file descriptor */
+ int pipe_fd;
+
+ int shmid;
+ int bufstruct_shmid;
+
+ /* the buffer memory */
+ void *mem;
+ /* buffer size */
+ int memlen;
+ /* number of subbuffers in buffer */
+ int n_subbufs;
+ /* size of each subbuffer */
+ int subbuf_size;
+ /* subbuf size count order */
+ int subbuf_size_order;
+ /* alloc size of all subbuf */
+ int alloc_size;
+
+ /* the buffer information struct */
+ void *bufstruct_mem;
+
+ long consumed_old;
+
+ int64_t pidunique;
+
+ void *user_data;
+};
+
+struct ustconsumer_callbacks;
+
+/**
+ * struct ustconsumer_instance - Contains the data associated with a trace instance.
+ * The lib user can read but MUST NOT change any attributes but callbacks.
+ * @callbacks: Contains the necessary callbacks for a tracing session.
+ */
+struct ustconsumer_instance {
+ struct ustconsumer_callbacks *callbacks;
+ int quit_program;
+ int is_init;
+ struct cds_list_head connections;
+ int epoll_fd;
+ struct ustcomm_sock *listen_sock;
+ char *sock_path;
+ pthread_mutex_t mutex;
+ int active_buffers;
+ int active_threads;
+};
+
+/**
+* struct ustconsumer_callbacks - Contains the necessary callbacks for a tracing
+* session. The user can set the unnecessary functions to NULL if he does not
+* need them.
+*/
+struct ustconsumer_callbacks {
+ /**
+ * on_open_buffer - Is called after a buffer is attached to process memory
+ *
+ * @data: pointer to the callbacks structure that has been passed to the
+ * library.
+ * @buf: structure that contains the data associated with the buffer
+ *
+ * Returns 0 if the callback succeeds else not 0.
+ *
+ * It has to be thread safe, because it is called by many threads.
+ */
+ int (*on_open_buffer)(struct ustconsumer_callbacks *data,
+ struct buffer_info *buf);
+
+ /**
+ * on_close_buffer - Is called after a buffer is detached from process memory
+ *
+ * @data: pointer to the callbacks structure that has been passed to the
+ * library.
+ * @buf: structure that contains the data associated with the buffer
+ *
+ * Returns 0 if the callback succeeds else not 0.
+ *
+ * It has to be thread safe, because it is called by many threads.
+ */
+ int (*on_close_buffer)(struct ustconsumer_callbacks *data,
+ struct buffer_info *buf);
+
+ /**
+ * on_read_subbuffer - Is called after a subbuffer is a reserved.
+ *
+ * @data: pointer to the callbacks structure that has been passed to the
+ * library.
+ * @buf: structure that contains the data associated with the buffer
+ *
+ * Returns 0 if the callback succeeds else not 0.
+ *
+ * It has to be thread safe, because it is called by many threads.
+ */
+ int (*on_read_subbuffer)(struct ustconsumer_callbacks *data,
+ struct buffer_info *buf);
+
+ /**
+ * on_read_partial_subbuffer - Is called when an incomplete subbuffer
+ * is being salvaged from an app crash
+ *
+ * @data: pointer to the callbacks structure that has been passed to the
+ * library.
+ * @buf: structure that contains the data associated with the buffer
+ * @subbuf_index: index of the subbuffer to read in the buffer
+ * @valid_length: number of bytes considered safe to read
+ *
+ * Returns 0 if the callback succeeds else not 0.
+ *
+ * It has to be thread safe, because it is called by many threads.
+ */
+ int (*on_read_partial_subbuffer)(struct ustconsumer_callbacks *data,
+ struct buffer_info *buf,
+ long subbuf_index,
+ unsigned long valid_length);
+
+ /**
+ * on_put_error - Is called when a put error has occured and the last
+ * subbuffer read is no longer safe to keep
+ *
+ * @data: pointer to the callbacks structure that has been passed to the
+ * library.
+ * @buf: structure that contains the data associated with the buffer
+ *
+ * Returns 0 if the callback succeeds else not 0.
+ *
+ * It has to be thread safe, because it is called by many threads.
+ */
+ int (*on_put_error)(struct ustconsumer_callbacks *data,
+ struct buffer_info *buf);
+
+ /**
+ * on_new_thread - Is called when a new thread is created
+ *
+ * @data: pointer to the callbacks structure that has been passed to the
+ * library.
+ *
+ * Returns 0 if the callback succeeds else not 0.
+ *
+ * It has to be thread safe, because it is called by many threads.
+ */
+ int (*on_new_thread)(struct ustconsumer_callbacks *data);
+
+ /**
+ * on_close_thread - Is called just before a thread is destroyed
+ *
+ * @data: pointer to the callbacks structure that has been passed to the
+ * library.
+ *
+ * Returns 0 if the callback succeeds else not 0.
+ *
+ * It has to be thread safe, because it is called by many threads.
+ */
+ int (*on_close_thread)(struct ustconsumer_callbacks *data);
+
+ /**
+ * on_trace_end - Is called at the very end of the tracing session. At
+ * this time, everything has been closed and the threads have
+ * been destroyed.
+ *
+ * @instance: pointer to the instance structure that has been passed to
+ * the library.
+ *
+ * Returns 0 if the callback succeeds else not 0.
+ *
+ * After this callback is called, no other callback will be called
+ * again and the tracing instance will be deleted automatically by
+ * libustconsumer. After this call, the user must not use the libustconsumer instance.
+ */
+ int (*on_trace_end)(struct ustconsumer_instance *instance);
+
+ /**
+ * The library's data.
+ */
+ void *user_data;
+};
+
+/**
+ * ustconsumer_new_instance - Is called to create a new tracing session.
+ *
+ * @callbacks: Pointer to a callbacks structure that contain the user
+ * callbacks and data.
+ * @sock_path: Path to the socket used for communication with the traced app
+ *
+ * Returns the instance if the function succeeds else NULL.
+ */
+struct ustconsumer_instance *
+ustconsumer_new_instance(
+ struct ustconsumer_callbacks *callbacks, char *sock_path);
+
+/**
+ * ustconsumer_delete_instance - Is called to free a ustconsumer_instance struct
+ *
+ * @instance: The tracing session instance that needs to be freed.
+ *
+ * This function should only be called if the instance has not been started,
+ * as it will automatically be called at the end of ustconsumer_start_instance.
+ */
+void ustconsumer_delete_instance(struct ustconsumer_instance *instance);
+
+/**
+ * ustconsumer_init_instance - Is called to initiliaze a new tracing session
+ *
+ * @instance: The tracing session instance that needs to be started.
+ *
+ * Returns 0 if the function succeeds.
+ *
+ * This function must be called between ustconsumer_new_instance and
+ * ustconsumer_start_instance. It sets up the communication between the library
+ * and the tracing application.
+ */
+int ustconsumer_init_instance(struct ustconsumer_instance *instance);
+
+/**
+ * ustconsumer_start_instance - Is called to start a new tracing session.
+ *
+ * @instance: The tracing session instance that needs to be started.
+ *
+ * Returns 0 if the function succeeds.
+ *
+ * This is a blocking function. The caller will be blocked on it until the
+ * tracing session is stopped by the user using ustconsumer_stop_instance or until
+ * the traced application terminates
+ */
+int ustconsumer_start_instance(struct ustconsumer_instance *instance);
+
+/**
+ * ustconsumer_stop_instance - Is called to stop a tracing session.
+ *
+ * @instance: The tracing session instance that needs to be stoped.
+ * @send_msg: If true, a message will be sent to the listening thread through
+ * the daemon socket to force it to return from the poll syscall
+ * and realize that it must close. This is not necessary if the
+ * instance is being stopped as part of an interrupt handler, as
+ * the interrupt itself will cause poll to return.
+ *
+ * Returns 0 if the function succeeds.
+ *
+ * This function returns immediately, it only tells libustconsumer to stop the
+ * instance. The on_trace_end callback will be called when the tracing session
+ * will really be stopped. The instance is deleted automatically by libustconsumer
+ * after on_trace_end is called.
+ */
+int ustconsumer_stop_instance(struct ustconsumer_instance *instance, int send_msg);
+
+#endif /* _USTCONSUMER_H */
+
--- /dev/null
+/* Copyright (C) 2009 Pierre-Marc Fournier
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _USTCTL_H
+#define _USTCTL_H
+
+#include <stdio.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <stdlib.h>
+#include <fcntl.h>
+
+#define USTCTL_ERR_CONN 1 /* Process connection error */
+#define USTCTL_ERR_ARG 2 /* Invalid function argument */
+#define USTCTL_ERR_GEN 3 /* General ustctl error */
+
+#define USTCTL_MS_CHR_OFF '0' /* Marker state 'on' character */
+#define USTCTL_MS_CHR_ON '1' /* Marker state 'on' character */
+#define USTCTL_MS_OFF 0 /* Marker state 'on' value */
+#define USTCTL_MS_ON 1 /* Marker state 'on' value */
+
+#define USTCTL_SOCK_PATH "/tmp/socks/"
+
+/* Channel/marker/state/format string (cmsf) info. structure */
+struct ust_marker_status {
+ char *channel; /* Channel name (end of ust_marker_status array if NULL) */
+ char *ust_marker; /* Marker name (end of ust_marker_status array if NULL) */
+ int state; /* State (0 := marker disabled, 1 := marker enabled) */
+ char *fs; /* Format string (end of ust_marker_status array if NULL) */
+};
+
+struct trace_event_status {
+ char *name;
+};
+
+extern pid_t *ustctl_get_online_pids(void);
+
+extern int ustctl_connect_pid(pid_t pid);
+
+extern int ustctl_set_ust_marker_state(int sock, const char *trace,
+ const char *channel, const char *ust_marker,
+ int state);
+
+extern int ustctl_set_subbuf_size(int sock, const char *trace,
+ const char *channel,
+ unsigned int subbuf_size);
+
+extern int ustctl_set_subbuf_num(int sock, const char *trace,
+ const char *channel,
+ unsigned int num);
+
+extern int ustctl_get_subbuf_size(int sock, const char *trace,
+ const char *channel);
+
+extern int ustctl_get_subbuf_num(pid_t pid, const char *trace,
+ const char *channel);
+
+extern int ustctl_destroy_trace(int sock, const char *trace);
+
+extern int ustctl_setup_and_start(int sock, const char *trace);
+
+extern int ustctl_stop_trace(int sock, const char *trace);
+
+extern int ustctl_create_trace(int sock, const char *trace);
+
+extern int ustctl_start_trace(int sock, const char *trace);
+
+extern int ustctl_alloc_trace(int sock, const char *trace);
+
+extern int ustctl_free_cmsf(struct ust_marker_status *);
+extern int ustctl_free_tes(struct trace_event_status *);
+extern unsigned int ustctl_count_nl(const char *);
+
+extern int ustctl_get_cmsf(int sock, struct ust_marker_status **);
+
+extern int ustctl_get_tes(int sock, struct trace_event_status **);
+
+extern int ustctl_set_sock_path(int sock, const char *sock_path);
+
+extern int ustctl_get_sock_path(int sock, char **sock_path);
+
+extern int ustctl_force_switch(int sock, const char *trace);
+
+#endif /* _USTCTL_H */
ust/kcompat/compiler.h \
ust/kcompat/types.h \
ust/tracectl.h \
- ust/ustctl.h \
- ust/ustconsumer.h \
ust/stringify.h
+++ /dev/null
-/*
- * libustconsumer header file
- *
- * Copyright 2005-2010 -
- * Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
- * Copyright 2010-
- * Oumarou Dicko <oumarou.dicko@polymtl.ca>
- * Michael Sills-Lavoie <michael.sills-lavoie@polymtl.ca>
- * Alexis Halle <alexis.halle@polymtl.ca>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef _USTCONSUMER_H
-#define _USTCONSUMER_H
-
-#include <pthread.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <urcu/list.h>
-
-#define USTCONSUMER_DEFAULT_TRACE_PATH "/tmp/usttrace"
-
-struct ustcomm_sock;
-
-struct buffer_info {
- char *name;
- char *trace;
- char *channel;
- int channel_cpu;
-
- pid_t pid;
- int app_sock;
- /* The pipe file descriptor */
- int pipe_fd;
-
- int shmid;
- int bufstruct_shmid;
-
- /* the buffer memory */
- void *mem;
- /* buffer size */
- int memlen;
- /* number of subbuffers in buffer */
- int n_subbufs;
- /* size of each subbuffer */
- int subbuf_size;
- /* subbuf size count order */
- int subbuf_size_order;
- /* alloc size of all subbuf */
- int alloc_size;
-
- /* the buffer information struct */
- void *bufstruct_mem;
-
- long consumed_old;
-
- int64_t pidunique;
-
- void *user_data;
-};
-
-struct ustconsumer_callbacks;
-
-/**
- * struct ustconsumer_instance - Contains the data associated with a trace instance.
- * The lib user can read but MUST NOT change any attributes but callbacks.
- * @callbacks: Contains the necessary callbacks for a tracing session.
- */
-struct ustconsumer_instance {
- struct ustconsumer_callbacks *callbacks;
- int quit_program;
- int is_init;
- struct cds_list_head connections;
- int epoll_fd;
- struct ustcomm_sock *listen_sock;
- char *sock_path;
- pthread_mutex_t mutex;
- int active_buffers;
- int active_threads;
-};
-
-/**
-* struct ustconsumer_callbacks - Contains the necessary callbacks for a tracing
-* session. The user can set the unnecessary functions to NULL if he does not
-* need them.
-*/
-struct ustconsumer_callbacks {
- /**
- * on_open_buffer - Is called after a buffer is attached to process memory
- *
- * @data: pointer to the callbacks structure that has been passed to the
- * library.
- * @buf: structure that contains the data associated with the buffer
- *
- * Returns 0 if the callback succeeds else not 0.
- *
- * It has to be thread safe, because it is called by many threads.
- */
- int (*on_open_buffer)(struct ustconsumer_callbacks *data,
- struct buffer_info *buf);
-
- /**
- * on_close_buffer - Is called after a buffer is detached from process memory
- *
- * @data: pointer to the callbacks structure that has been passed to the
- * library.
- * @buf: structure that contains the data associated with the buffer
- *
- * Returns 0 if the callback succeeds else not 0.
- *
- * It has to be thread safe, because it is called by many threads.
- */
- int (*on_close_buffer)(struct ustconsumer_callbacks *data,
- struct buffer_info *buf);
-
- /**
- * on_read_subbuffer - Is called after a subbuffer is a reserved.
- *
- * @data: pointer to the callbacks structure that has been passed to the
- * library.
- * @buf: structure that contains the data associated with the buffer
- *
- * Returns 0 if the callback succeeds else not 0.
- *
- * It has to be thread safe, because it is called by many threads.
- */
- int (*on_read_subbuffer)(struct ustconsumer_callbacks *data,
- struct buffer_info *buf);
-
- /**
- * on_read_partial_subbuffer - Is called when an incomplete subbuffer
- * is being salvaged from an app crash
- *
- * @data: pointer to the callbacks structure that has been passed to the
- * library.
- * @buf: structure that contains the data associated with the buffer
- * @subbuf_index: index of the subbuffer to read in the buffer
- * @valid_length: number of bytes considered safe to read
- *
- * Returns 0 if the callback succeeds else not 0.
- *
- * It has to be thread safe, because it is called by many threads.
- */
- int (*on_read_partial_subbuffer)(struct ustconsumer_callbacks *data,
- struct buffer_info *buf,
- long subbuf_index,
- unsigned long valid_length);
-
- /**
- * on_put_error - Is called when a put error has occured and the last
- * subbuffer read is no longer safe to keep
- *
- * @data: pointer to the callbacks structure that has been passed to the
- * library.
- * @buf: structure that contains the data associated with the buffer
- *
- * Returns 0 if the callback succeeds else not 0.
- *
- * It has to be thread safe, because it is called by many threads.
- */
- int (*on_put_error)(struct ustconsumer_callbacks *data,
- struct buffer_info *buf);
-
- /**
- * on_new_thread - Is called when a new thread is created
- *
- * @data: pointer to the callbacks structure that has been passed to the
- * library.
- *
- * Returns 0 if the callback succeeds else not 0.
- *
- * It has to be thread safe, because it is called by many threads.
- */
- int (*on_new_thread)(struct ustconsumer_callbacks *data);
-
- /**
- * on_close_thread - Is called just before a thread is destroyed
- *
- * @data: pointer to the callbacks structure that has been passed to the
- * library.
- *
- * Returns 0 if the callback succeeds else not 0.
- *
- * It has to be thread safe, because it is called by many threads.
- */
- int (*on_close_thread)(struct ustconsumer_callbacks *data);
-
- /**
- * on_trace_end - Is called at the very end of the tracing session. At
- * this time, everything has been closed and the threads have
- * been destroyed.
- *
- * @instance: pointer to the instance structure that has been passed to
- * the library.
- *
- * Returns 0 if the callback succeeds else not 0.
- *
- * After this callback is called, no other callback will be called
- * again and the tracing instance will be deleted automatically by
- * libustconsumer. After this call, the user must not use the libustconsumer instance.
- */
- int (*on_trace_end)(struct ustconsumer_instance *instance);
-
- /**
- * The library's data.
- */
- void *user_data;
-};
-
-/**
- * ustconsumer_new_instance - Is called to create a new tracing session.
- *
- * @callbacks: Pointer to a callbacks structure that contain the user
- * callbacks and data.
- * @sock_path: Path to the socket used for communication with the traced app
- *
- * Returns the instance if the function succeeds else NULL.
- */
-struct ustconsumer_instance *
-ustconsumer_new_instance(
- struct ustconsumer_callbacks *callbacks, char *sock_path);
-
-/**
- * ustconsumer_delete_instance - Is called to free a ustconsumer_instance struct
- *
- * @instance: The tracing session instance that needs to be freed.
- *
- * This function should only be called if the instance has not been started,
- * as it will automatically be called at the end of ustconsumer_start_instance.
- */
-void ustconsumer_delete_instance(struct ustconsumer_instance *instance);
-
-/**
- * ustconsumer_init_instance - Is called to initiliaze a new tracing session
- *
- * @instance: The tracing session instance that needs to be started.
- *
- * Returns 0 if the function succeeds.
- *
- * This function must be called between ustconsumer_new_instance and
- * ustconsumer_start_instance. It sets up the communication between the library
- * and the tracing application.
- */
-int ustconsumer_init_instance(struct ustconsumer_instance *instance);
-
-/**
- * ustconsumer_start_instance - Is called to start a new tracing session.
- *
- * @instance: The tracing session instance that needs to be started.
- *
- * Returns 0 if the function succeeds.
- *
- * This is a blocking function. The caller will be blocked on it until the
- * tracing session is stopped by the user using ustconsumer_stop_instance or until
- * the traced application terminates
- */
-int ustconsumer_start_instance(struct ustconsumer_instance *instance);
-
-/**
- * ustconsumer_stop_instance - Is called to stop a tracing session.
- *
- * @instance: The tracing session instance that needs to be stoped.
- * @send_msg: If true, a message will be sent to the listening thread through
- * the daemon socket to force it to return from the poll syscall
- * and realize that it must close. This is not necessary if the
- * instance is being stopped as part of an interrupt handler, as
- * the interrupt itself will cause poll to return.
- *
- * Returns 0 if the function succeeds.
- *
- * This function returns immediately, it only tells libustconsumer to stop the
- * instance. The on_trace_end callback will be called when the tracing session
- * will really be stopped. The instance is deleted automatically by libustconsumer
- * after on_trace_end is called.
- */
-int ustconsumer_stop_instance(struct ustconsumer_instance *instance, int send_msg);
-
-#endif /* _USTCONSUMER_H */
-
+++ /dev/null
-/* Copyright (C) 2009 Pierre-Marc Fournier
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef _USTCTL_H
-#define _USTCTL_H
-
-#include <stdio.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <stdlib.h>
-#include <fcntl.h>
-
-#define USTCTL_ERR_CONN 1 /* Process connection error */
-#define USTCTL_ERR_ARG 2 /* Invalid function argument */
-#define USTCTL_ERR_GEN 3 /* General ustctl error */
-
-#define USTCTL_MS_CHR_OFF '0' /* Marker state 'on' character */
-#define USTCTL_MS_CHR_ON '1' /* Marker state 'on' character */
-#define USTCTL_MS_OFF 0 /* Marker state 'on' value */
-#define USTCTL_MS_ON 1 /* Marker state 'on' value */
-
-#define USTCTL_SOCK_PATH "/tmp/socks/"
-
-/* Channel/marker/state/format string (cmsf) info. structure */
-struct ust_marker_status {
- char *channel; /* Channel name (end of ust_marker_status array if NULL) */
- char *ust_marker; /* Marker name (end of ust_marker_status array if NULL) */
- int state; /* State (0 := marker disabled, 1 := marker enabled) */
- char *fs; /* Format string (end of ust_marker_status array if NULL) */
-};
-
-struct trace_event_status {
- char *name;
-};
-
-extern pid_t *ustctl_get_online_pids(void);
-
-extern int ustctl_connect_pid(pid_t pid);
-
-extern int ustctl_set_ust_marker_state(int sock, const char *trace,
- const char *channel, const char *ust_marker,
- int state);
-
-extern int ustctl_set_subbuf_size(int sock, const char *trace,
- const char *channel,
- unsigned int subbuf_size);
-
-extern int ustctl_set_subbuf_num(int sock, const char *trace,
- const char *channel,
- unsigned int num);
-
-extern int ustctl_get_subbuf_size(int sock, const char *trace,
- const char *channel);
-
-extern int ustctl_get_subbuf_num(pid_t pid, const char *trace,
- const char *channel);
-
-extern int ustctl_destroy_trace(int sock, const char *trace);
-
-extern int ustctl_setup_and_start(int sock, const char *trace);
-
-extern int ustctl_stop_trace(int sock, const char *trace);
-
-extern int ustctl_create_trace(int sock, const char *trace);
-
-extern int ustctl_start_trace(int sock, const char *trace);
-
-extern int ustctl_alloc_trace(int sock, const char *trace);
-
-extern int ustctl_free_cmsf(struct ust_marker_status *);
-extern int ustctl_free_tes(struct trace_event_status *);
-extern unsigned int ustctl_count_nl(const char *);
-
-extern int ustctl_get_cmsf(int sock, struct ust_marker_status **);
-
-extern int ustctl_get_tes(int sock, struct trace_event_status **);
-
-extern int ustctl_set_sock_path(int sock, const char *sock_path);
-
-extern int ustctl_get_sock_path(int sock, char **sock_path);
-
-extern int ustctl_force_switch(int sock, const char *trace);
-
-#endif /* _USTCTL_H */
+++ /dev/null
-#!/bin/sh
-
-# usttrace by Pierre-Marc Fournier 2009
-# Distributed under the GPLv2.
-
-error() {
- echo "$0: error: $1" 1>&2
-}
-
-sighandler() {
- echo "Caught Ctrl-C"
- if [ -z "${UST_CONSUMERD_PID}" ]; then
- UST_CONSUMERD_PID=`cat $pidfilepath`
- fi
- # Tell the daemon to die
- kill -TERM "${UST_CONSUMERD_PID}"
-
- echo "Waiting for ust-consumerd to shutdown..."
- wait "${UST_CONSUMERD_PID}"
-
- rm "$pidfilepath"
-
- exit 0;
-}
-
-USTTRACE_DIR="$(dirname $0)"
-if [ -x "${USTTRACE_DIR}/ust-consumerd/ust-consumerd" ] ; then
- # Use the not installed libraries instead
- UST_CONSUMERD="${USTTRACE_DIR}/ust-consumerd/ust-consumerd"
- LIBINTERFORK_PATH="${USTTRACE_DIR}/libustfork/.libs/libustfork.so"
- LIBMALLOCWRAP_PATH="${USTTRACE_DIR}/libustinstr-malloc/.libs/libustinstr-malloc.so"
- LIBUST_PATH="${USTTRACE_DIR}/libust/.libs/libust.so"
-else
- # Use the libraries that the dynamic link finds
- UST_CONSUMERD="ust-consumerd"
- if [ ! -x "$(which ust-consumerd 2>/dev/null)" ]; then
- error "cannot find an executable ust-consumerd; make sure its location is in the PATH"
- exit 1
- fi
- LIBINTERFORK_PATH="libustfork.so"
- LIBMALLOCWRAP_PATH="libustinstr-malloc.so"
- LIBUST_PATH="libust.so.0"
-fi
-
-BASE_TRACE_DIR="${HOME}/.usttraces"
-
-usage() {
- echo "usage: $0 OPTIONS COMMAND" 1>&2
- echo "" 1>&2
- echo "Options:" 1>&2
- echo " -l Runtime link with UST library." 1>&2
- echo " (Needed only if program was not linked at compile time with libust.)" 1>&2
- echo " -L Add path to ust libraries to LD_LIBRARY_PATH." 1>&2
- echo " -m Instrument malloc calls." 1>&2
- echo " -f Also trace forked processes." 1>&2
- echo " -s Use system-wide daemon instead of creating one for this session." 1>&2
- echo " -S Specify the subbuffer size." 1>&2
- echo " -N Specify the number of subbuffers." 1>&2
- echo " -o Output directory of the trace." 1>&2
-}
-
-while getopts ":hlLmfsWS:N:o:" options; do
- case $options in
- l) arg_preload_libust=1;;
- L) arg_ld_std_ust=1;;
- m) arg_preload_malloc=1;;
- f) arg_preload_fork=1;;
- s) arg_syswide_daemon=1;;
- W) where=1;;
- S) export UST_SUBBUF_SIZE=$OPTARG;;
- N) export UST_SUBBUF_NUM=$OPTARG;;
- o) OUTPUT_DIR=$OPTARG;;
- h) usage;
- exit 0;;
- \?) usage
- exit 1;;
- *) usage
- exit 1;;
- esac
-done
-shift $(($OPTIND - 1))
-
-if [ -n "$where" ]; then
- echo $BASE_TRACE_DIR/$(ls "$BASE_TRACE_DIR" | tail -n 1)
- exit 0
-fi
-
-# Prepare vars
-CMD=$*
-
-# Validate input
-if [ -z "$HOME" ];
-then
- error "no home specified"
-fi
-
-if [ -z "$CMD" ];
-then
- error "no command specified"
- usage;
- exit 1
-fi
-
-# Create directory for trace output
-if [ -n "$OUTPUT_DIR" ]; then
- OUTDIR=$OUTPUT_DIR
-else
- DATESTRING="$(hostname)-$(date +%Y%m%d%H%M%S%N)"
- OUTDIR="$BASE_TRACE_DIR/$DATESTRING"
-fi
-
-# Check if directory exist
-if [ ! -d "$OUTDIR" ]; then
- mkdir -p $OUTDIR
- if [ $? -eq 1 ]; then
- exit 1
- fi
-fi
-
-# Choose ust-consumerd socket path
-UST_CONSUMERD_SOCKPATH="/tmp/ust-consumerd-sock-$$"
-
-if [ "$arg_syswide_daemon" != "1" ];
-then
- pidfilepath="/tmp/usttrace-$USER-$(date +%Y%m%d%H%M%S%N)-ust-consumerd-pid"
- trap "sighandler $pidfilepath" INT
- mkfifo -m 0600 "$pidfilepath"
- # Start daemon
- ${UST_CONSUMERD} --pidfile "$pidfilepath" -s "${UST_CONSUMERD_SOCKPATH}" -o "$OUTDIR" >"$OUTDIR/ust-consumerd.log" 2>&1 &
- # ust-consumerd sets up its server socket
- # ust-consumerd opens the pidfile, blocks because no one has opened it
- # we open pidfile
- # we block reading pidfile
- # ust-consumerd writes to pidfile
- # ust-consumerd closes pidfile
- # we unblock reading pidfile
- UST_CONSUMERD_PID=`cat $pidfilepath`
- export UST_DAEMON_SOCKET="${UST_CONSUMERD_SOCKPATH}"
-fi
-
-# Establish the environment for the command
-(
- export UST_TRACE=1
- export UST_AUTOPROBE=1
-
- if [ "$arg_preload_libust" = "1" ];
- then
- if [ -n "${LIBUST_PATH%libust.so}" ];
- then
- if [ -n "$LD_LIBRARY_PATH" ];
- then
- export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${LIBUST_PATH%libust.so}"
- else
- export LD_LIBRARY_PATH="${LIBUST_PATH%libust.so}"
- fi
- fi
- if [ -n "$LIBUST_PATH" ];
- then
- if [ -n "$LD_PRELOAD" ];
- then
- export LD_PRELOAD="$LD_PRELOAD:$LIBUST_PATH"
- else
- export LD_PRELOAD="$LIBUST_PATH"
- fi
- fi
- fi
-
- if [ "$arg_ld_std_ust" = "1" ] && [ -n "${LIBUST_PATH%libust.so}" ];
- then
- if [ -n "$LD_LIBRARY_PATH" ];
- then
- export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${LIBUST_PATH%libust.so}"
- else
- export LD_LIBRARY_PATH="${LIBUST_PATH%libust.so}"
- fi
- fi
-
- if [ "$arg_preload_malloc" = "1" ] && [ -n "$LIBMALLOCWRAP_PATH" ];
- then
- if [ -n "$LD_PRELOAD" ];
- then
- export LD_PRELOAD="$LD_PRELOAD:$LIBMALLOCWRAP_PATH"
- else
- export LD_PRELOAD="$LIBMALLOCWRAP_PATH"
- fi
- fi
-
- if [ "$arg_preload_fork" = "1" ] && [ -n "$LIBINTERFORK_PATH" ];
- then
- if [ -n "$LD_PRELOAD" ];
- then
- export LD_PRELOAD="$LD_PRELOAD:$LIBINTERFORK_PATH"
- else
- export LD_PRELOAD="$LIBINTERFORK_PATH"
- fi
- fi
-
-# Execute the command
- $CMD 2>&1
-) | tee "$OUTDIR/app.log"
-
-## Because of the keepalive mechanism, we're sure that by the time
-## we get here, the daemon is connected to all the buffers that still exist.
-## Therefore we can politely ask it to die when it's done.
-
-if [ "$arg_syswide_daemon" != "1" ];
-then
- # Tell the daemon to die
- kill -TERM "${UST_CONSUMERD_PID}"
-
- echo "Waiting for ust-consumerd to shutdown..."
- wait "${UST_CONSUMERD_PID}"
-
- rm "$pidfilepath"
-fi
-
-echo "Trace was output in: " $OUTDIR