* [PATCH v4 lttng-ust 1/2] Introduce vtracef
@ 2020-03-03 23:10 Maxime Roussin-Belanger
2020-03-03 23:10 ` [PATCH v4 lttng-ust 2/2] Introduce vtracelog Maxime Roussin-Belanger
2020-03-04 15:27 ` [PATCH v4 lttng-ust 1/2] Introduce vtracef Mathieu Desnoyers
0 siblings, 2 replies; 3+ messages in thread
From: Maxime Roussin-Belanger @ 2020-03-03 23:10 UTC (permalink / raw)
To: lttng-dev
vtracef accepts a va_list argument to simplify
tracing functions which use a va_list
Here's an example from wpa_supplicant that I wanted to
trace:
void wpa_debug(int level, const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
...
// The call I want to easily trace with vtracef
vprintf(fmt, ap);
...
va_end(ap);
}
wpa_debug is used a fair amount and it would be annoying to
replace all the wpa_debug calls with tracef.
With vtracef, it simplifies the find and replace effort by
only changing it at one place.
Signed-off-by: Maxime Roussin-Belanger <maxime.roussinbelanger@gmail.com>
---
Changes in v4:
* Use a static inline function to force compiler to inline
the vtracef function call.
* Fix styling issue
doc/examples/demo-tracef/Makefile | 14 +++++-
doc/examples/demo-tracef/demo-vtracef.c | 58 +++++++++++++++++++++++++
doc/man/tracef-tracelog-limitations.txt | 3 ++
doc/man/tracef.3.txt | 11 ++---
include/lttng/tracef.h | 8 ++++
liblttng-ust/tracef.c | 24 +++++++---
6 files changed, 105 insertions(+), 13 deletions(-)
create mode 100644 doc/examples/demo-tracef/demo-vtracef.c
diff --git a/doc/examples/demo-tracef/Makefile b/doc/examples/demo-tracef/Makefile
index ee207843..809aac19 100644
--- a/doc/examples/demo-tracef/Makefile
+++ b/doc/examples/demo-tracef/Makefile
@@ -20,18 +20,28 @@ LIBS = -ldl -llttng-ust # On Linux
LOCAL_CPPFLAGS += -I.
AM_V_P := :
-all: demo-tracef
+all: demo-tracef demo-vtracef
demo-tracef.o: demo-tracef.c
@if $(AM_V_P); then set -x; else echo " CC $@"; fi; \
$(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) $(AM_CFLAGS) $(AM_CPPFLAGS) \
$(CFLAGS) -c -o $@ $<
demo-tracef: demo-tracef.o
@if $(AM_V_P); then set -x; else echo " CCLD $@"; fi; \
$(CC) $(LDFLAGS) $(AM_CFLAGS) $(AM_LDFLAGS) $(CFLAGS) \
-o $@ $< $(LIBS)
+demo-vtracef.o: demo-vtracef.c
+ @if $(AM_V_P); then set -x; else echo " CC $@"; fi; \
+ $(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) $(AM_CFLAGS) $(AM_CPPFLAGS) \
+ $(CFLAGS) -c -o $@ $<
+
+demo-vtracef: demo-vtracef.o
+ @if $(AM_V_P); then set -x; else echo " CCLD $@"; fi; \
+ $(CC) $(LDFLAGS) $(AM_CFLAGS) $(AM_LDFLAGS) $(CFLAGS) \
+ -o $@ $< $(LIBS)
+
.PHONY: clean
clean:
- rm -f *.o *.a demo-tracef
+ rm -f *.o *.a demo-tracef demo-vtracef
diff --git a/doc/examples/demo-tracef/demo-vtracef.c b/doc/examples/demo-tracef/demo-vtracef.c
new file mode 100644
index 00000000..5ade85a6
--- /dev/null
+++ b/doc/examples/demo-tracef/demo-vtracef.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2020 Maxime Roussin-Belanger <maxime.roussinbelanger@gmail.com>
+ *
+ * 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; version 2.1 of
+ * the License.
+ *
+ * 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
+ */
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <lttng/tracef.h>
+
+void print_debug(const char* msg, ...)
+{
+ va_list ap;
+ va_start(ap, msg);
+
+ vtracef(msg, ap);
+
+ va_end(ap);
+}
+
+int main(int argc, char **argv)
+{
+ int i;
+ int delay = 0;
+ const char *str = "mystring test";
+ long l = 0x42;
+
+ if (argc > 2)
+ delay = atoi(argv[1]);
+
+ fprintf(stderr, "Demo program starting.\n");
+
+ sleep(delay);
+
+ fprintf(stderr, "Tracing... ");
+
+ for (i = 0; i < 5; i++) {
+ print_debug("This is a \"%s\" formatted %d event %lx", str, i, l);
+ }
+
+ fprintf(stderr, " done.\n");
+ return 0;
+}
diff --git a/doc/man/tracef-tracelog-limitations.txt b/doc/man/tracef-tracelog-limitations.txt
index a9491903..ad4130dd 100644
--- a/doc/man/tracef-tracelog-limitations.txt
+++ b/doc/man/tracef-tracelog-limitations.txt
@@ -21,4 +21,7 @@ Thus, +{macro-name}()+ is useful for quick prototyping and debugging, but
should not be considered for any permanent/serious application
instrumentation.
++v{macro-name}()+ does not have a `STAP_PROBEV()` call, because `STAP_PROBEV()`
+does not support `va_list`. If you need it, you should emit this call yourself.
+
See man:lttng-ust(3) to learn more about custom tracepoint providers.
diff --git a/doc/man/tracef.3.txt b/doc/man/tracef.3.txt
index 1068afad..2894ca45 100644
--- a/doc/man/tracef.3.txt
+++ b/doc/man/tracef.3.txt
@@ -5,43 +5,44 @@ tracef(3)
NAME
----
-tracef - LTTng-UST printf(3)-like interface
+tracef, vtracef - LTTng-UST printf(3)-like interface
SYNOPSIS
--------
[verse]
*#include <lttng/tracef.h>*
[verse]
#define *tracef*('fmt', ...)
+#define *vtracef*('fmt', 'va_list' ap)
Link with `-llttng-ust`.
DESCRIPTION
-----------
The LTTng-UST `tracef()` API allows you to trace your application with
the help of a simple man:printf(3)-like macro. The 'fmt' argument is
passed directly to the 'fmt' parameter of man:vasprintf(3), as well as
the optional parameters following 'fmt'.
-To use `tracef()`, include `<lttng/tracef.h>` where you need it, and
-link your application with `liblttng-ust`. See the <<example,EXAMPLE>>
+To use `tracef()` or `vtracef()`, include `<lttng/tracef.h>` where you need it,
+and link your application with `liblttng-ust`. See the <<example,EXAMPLE>>
section below for a complete usage example.
-Once your application is instrumented with `tracef()` calls and
+Once your application is instrumented with `tracef()` or `vtracef()` calls and
ready to run, use man:lttng-enable-event(1) to enable the
`lttng_ust_tracef:*` event.
The `tracef()` events contain a single field, named `msg`, which is the
formatted string output.
If you need to attach a specific log level to a `tracef()` call, use
man:tracelog(3) instead.
See also the <<limitations,LIMITATIONS>> section below for important
-limitations to consider when using `tracef()`.
+limitations to consider when using `tracef()` or `vtracef()`.
[[example]]
diff --git a/include/lttng/tracef.h b/include/lttng/tracef.h
index 0c59c9ae..854ccdce 100644
--- a/include/lttng/tracef.h
+++ b/include/lttng/tracef.h
@@ -32,13 +32,21 @@ extern "C" {
extern
void _lttng_ust_tracef(const char *fmt, ...);
+extern
+void _lttng_ust_vtracef(const char *fmt, va_list ap);
+
#define tracef(fmt, ...) \
do { \
LTTNG_STAP_PROBEV(tracepoint_lttng_ust_tracef, event, ## __VA_ARGS__); \
if (caa_unlikely(__tracepoint_lttng_ust_tracef___event.state)) \
_lttng_ust_tracef(fmt, ## __VA_ARGS__); \
} while (0)
+#define vtracef(fmt, ap) \
+ do { \
+ if (caa_unlikely(__tracepoint_lttng_ust_tracef___event.state)) \
+ _lttng_ust_vtracef(fmt, ap); \
+ } while (0)
#ifdef __cplusplus
}
#endif
diff --git a/liblttng-ust/tracef.c b/liblttng-ust/tracef.c
index ea98e43e..28a5e05b 100644
--- a/liblttng-ust/tracef.c
+++ b/liblttng-ust/tracef.c
@@ -29,20 +29,32 @@
#define TRACEPOINT_DEFINE
#include "lttng-ust-tracef-provider.h"
-void _lttng_ust_tracef(const char *fmt, ...)
+static inline __attribute__((always_inline))
+void __lttng_ust_vtracef(const char *fmt, va_list ap)
{
- va_list ap;
char *msg;
- int len;
-
- va_start(ap, fmt);
- len = vasprintf(&msg, fmt, ap);
+ const int len = vasprintf(&msg, fmt, ap);
/* len does not include the final \0 */
if (len < 0)
goto end;
__tracepoint_cb_lttng_ust_tracef___event(msg, len,
LTTNG_UST_CALLER_IP());
free(msg);
end:
+ return;
+}
+
+void _lttng_ust_vtracef(const char *fmt, va_list ap)
+{
+ __lttng_ust_vtracef(fmt, ap);
+}
+
+void _lttng_ust_tracef(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ __lttng_ust_vtracef(fmt, ap);
+
va_end(ap);
}
--
2.20.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v4 lttng-ust 2/2] Introduce vtracelog
2020-03-03 23:10 [PATCH v4 lttng-ust 1/2] Introduce vtracef Maxime Roussin-Belanger
@ 2020-03-03 23:10 ` Maxime Roussin-Belanger
2020-03-04 15:27 ` [PATCH v4 lttng-ust 1/2] Introduce vtracef Mathieu Desnoyers
1 sibling, 0 replies; 3+ messages in thread
From: Maxime Roussin-Belanger @ 2020-03-03 23:10 UTC (permalink / raw)
To: lttng-dev
vtracelog works the same as vtracef, but takes a log level
as a parameter and has the same limitations.
Signed-off-by: Maxime Roussin-Belanger <maxime.roussinbelanger@gmail.com>
---
Changes in v4:
* Use a static inline function to force compiler to inline
the vtracelog function call.
* Fix styling issue.
doc/examples/demo-tracelog/Makefile | 14 ++++++++++++--
doc/man/tracelog.3.txt | 9 +++++----
include/lttng/tracelog.h | 7 +++++++
liblttng-ust/tracelog.c | 27 +++++++++++++++++++++------
4 files changed, 45 insertions(+), 12 deletions(-)
diff --git a/doc/examples/demo-tracelog/Makefile b/doc/examples/demo-tracelog/Makefile
index 0d9a20aa..623979d3 100644
--- a/doc/examples/demo-tracelog/Makefile
+++ b/doc/examples/demo-tracelog/Makefile
@@ -20,18 +20,28 @@ LIBS = -ldl -llttng-ust # On Linux
LOCAL_CPPFLAGS += -I.
AM_V_P := :
-all: demo-tracelog
+all: demo-tracelog demo-vtracelog
demo-tracelog.o: demo-tracelog.c
@if $(AM_V_P); then set -x; else echo " CC $@"; fi; \
$(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) $(AM_CFLAGS) $(AM_CPPFLAGS) \
$(CFLAGS) -c -o $@ $<
demo-tracelog: demo-tracelog.o
@if $(AM_V_P); then set -x; else echo " CCLD $@"; fi; \
$(CC) $(LDFLAGS) $(AM_CFLAGS) $(AM_LDFLAGS) $(CFLAGS) \
-o $@ $< $(LIBS)
+demo-vtracelog.o: demo-vtracelog.c
+ @if $(AM_V_P); then set -x; else echo " CC $@"; fi; \
+ $(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) $(AM_CFLAGS) $(AM_CPPFLAGS) \
+ $(CFLAGS) -c -o $@ $<
+
+demo-vtracelog: demo-vtracelog.o
+ @if $(AM_V_P); then set -x; else echo " CCLD $@"; fi; \
+ $(CC) $(LDFLAGS) $(AM_CFLAGS) $(AM_LDFLAGS) $(CFLAGS) \
+ -o $@ $< $(LIBS)
+
.PHONY: clean
clean:
- rm -f *.o *.a demo-tracelog
+ rm -f *.o *.a demo-tracelog demo-vtracelog
diff --git a/doc/man/tracelog.3.txt b/doc/man/tracelog.3.txt
index 1281ce7c..5cf1953a 100644
--- a/doc/man/tracelog.3.txt
+++ b/doc/man/tracelog.3.txt
@@ -15,6 +15,7 @@ SYNOPSIS
[verse]
#define *tracelog*('level', 'fmt', ...)
+#define *vtracelog*('level', 'fmt', 'va_list' ap)
Link with `-llttng-ust`.
@@ -34,9 +35,9 @@ The available values for the 'level' parameter are:
include::log-levels.txt[]
-To use `tracelog()`, include `<lttng/tracelog.h>` where you need it, and
-link your application with `liblttng-ust`. See the <<example,EXAMPLE>>
-section below for a complete usage example.
+To use `tracelog()` or `vtracelog()`, include `<lttng/tracelog.h>` where you
+need it, and link your application with `liblttng-ust`.
+See the <<example,EXAMPLE>> section below for a complete usage example.
Once your application is instrumented with `tracelog()` calls and
ready to run, use man:lttng-enable-event(1) to enable the
@@ -67,7 +68,7 @@ If you do not need to attach a specific log level to a `tracelog()`
call, use man:tracef(3) instead.
See also the <<limitations,LIMITATIONS>> section below for important
-limitations to consider when using `tracelog()`.
+limitations to consider when using `tracelog()` or `vtracelog()`.
[[example]]
diff --git a/include/lttng/tracelog.h b/include/lttng/tracelog.h
index 4309d12e..7aa86809 100644
--- a/include/lttng/tracelog.h
+++ b/include/lttng/tracelog.h
@@ -59,6 +59,13 @@ TP_TRACELOG_CB_TEMPLATE(TRACE_DEBUG);
fmt, ## __VA_ARGS__); \
} while (0)
+#define vtracelog(level, fmt, ap) \
+ do { \
+ if (caa_unlikely(__tracepoint_lttng_ust_tracelog___##level.state)) \
+ _lttng_ust_tracelog_##level(__FILE__, __LINE__, __func__, \
+ fmt, ap); \
+ } while (0)
+
#ifdef __cplusplus
}
#endif
diff --git a/liblttng-ust/tracelog.c b/liblttng-ust/tracelog.c
index 65fc87ed..f6a297f4 100644
--- a/liblttng-ust/tracelog.c
+++ b/liblttng-ust/tracelog.c
@@ -30,24 +30,39 @@
#include "lttng-ust-tracelog-provider.h"
#define TRACELOG_CB(level) \
- void _lttng_ust_tracelog_##level(const char *file, \
+ static inline __attribute__((always_inline)) \
+ void __lttng_ust_vtracelog_##level(const char *file, \
int line, const char *func, \
- const char *fmt, ...) \
+ const char *fmt, va_list ap) \
{ \
- va_list ap; \
char *msg; \
- int len; \
+ const int len = vasprintf(&msg, fmt, ap); \
\
- va_start(ap, fmt); \
- len = vasprintf(&msg, fmt, ap); \
/* len does not include the final \0 */ \
if (len < 0) \
goto end; \
__tracepoint_cb_lttng_ust_tracelog___##level(file, \
line, func, msg, len, \
LTTNG_UST_CALLER_IP()); \
free(msg); \
end: \
+ return; \
+ } \
+ \
+ void _lttng_ust_vtracelog_##level(const char *file, \
+ int line, const char *func, \
+ const char *fmt, va_list ap) \
+ { \
+ __lttng_ust_vtracelog_##level(file, line, func, fmt, ap); \
+ } \
+ \
+ void _lttng_ust_tracelog_##level(const char *file, \
+ int line, const char *func, \
+ const char *fmt, ...) \
+ { \
+ va_list ap; \
+ va_start(ap, fmt); \
+ __lttng_ust_vtracelog_##level(file, line, func, fmt, ap); \
va_end(ap); \
}
--
2.20.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v4 lttng-ust 1/2] Introduce vtracef
2020-03-03 23:10 [PATCH v4 lttng-ust 1/2] Introduce vtracef Maxime Roussin-Belanger
2020-03-03 23:10 ` [PATCH v4 lttng-ust 2/2] Introduce vtracelog Maxime Roussin-Belanger
@ 2020-03-04 15:27 ` Mathieu Desnoyers
1 sibling, 0 replies; 3+ messages in thread
From: Mathieu Desnoyers @ 2020-03-04 15:27 UTC (permalink / raw)
To: Maxime Roussin-Belanger; +Cc: lttng-dev
----- On Mar 3, 2020, at 6:10 PM, Maxime Roussin-Belanger maxime.roussinbelanger@gmail.com wrote:
> vtracef accepts a va_list argument to simplify
> tracing functions which use a va_list
Both patches merged into lttng-ust master branch, thanks for
your contribution!
I noticed that demo-vtracelog.c was missing from the patch. I implemented
one myself.
I also added the missing demo files to the .gitignore listing in the
top-level directory.
Mathieu
>
> Here's an example from wpa_supplicant that I wanted to
> trace:
>
> void wpa_debug(int level, const char* fmt, ...)
> {
> va_list ap;
> va_start(ap, fmt);
>
> ...
> // The call I want to easily trace with vtracef
> vprintf(fmt, ap);
>
> ...
> va_end(ap);
> }
>
> wpa_debug is used a fair amount and it would be annoying to
> replace all the wpa_debug calls with tracef.
>
> With vtracef, it simplifies the find and replace effort by
> only changing it at one place.
>
> Signed-off-by: Maxime Roussin-Belanger <maxime.roussinbelanger@gmail.com>
> ---
> Changes in v4:
> * Use a static inline function to force compiler to inline
> the vtracef function call.
> * Fix styling issue
>
> doc/examples/demo-tracef/Makefile | 14 +++++-
> doc/examples/demo-tracef/demo-vtracef.c | 58 +++++++++++++++++++++++++
> doc/man/tracef-tracelog-limitations.txt | 3 ++
> doc/man/tracef.3.txt | 11 ++---
> include/lttng/tracef.h | 8 ++++
> liblttng-ust/tracef.c | 24 +++++++---
> 6 files changed, 105 insertions(+), 13 deletions(-)
> create mode 100644 doc/examples/demo-tracef/demo-vtracef.c
>
> diff --git a/doc/examples/demo-tracef/Makefile
> b/doc/examples/demo-tracef/Makefile
> index ee207843..809aac19 100644
> --- a/doc/examples/demo-tracef/Makefile
> +++ b/doc/examples/demo-tracef/Makefile
> @@ -20,18 +20,28 @@ LIBS = -ldl -llttng-ust # On Linux
> LOCAL_CPPFLAGS += -I.
> AM_V_P := :
>
> -all: demo-tracef
> +all: demo-tracef demo-vtracef
>
> demo-tracef.o: demo-tracef.c
> @if $(AM_V_P); then set -x; else echo " CC $@"; fi; \
> $(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) $(AM_CFLAGS) $(AM_CPPFLAGS) \
> $(CFLAGS) -c -o $@ $<
>
> demo-tracef: demo-tracef.o
> @if $(AM_V_P); then set -x; else echo " CCLD $@"; fi; \
> $(CC) $(LDFLAGS) $(AM_CFLAGS) $(AM_LDFLAGS) $(CFLAGS) \
> -o $@ $< $(LIBS)
>
> +demo-vtracef.o: demo-vtracef.c
> + @if $(AM_V_P); then set -x; else echo " CC $@"; fi; \
> + $(CC) $(CPPFLAGS) $(LOCAL_CPPFLAGS) $(AM_CFLAGS) $(AM_CPPFLAGS) \
> + $(CFLAGS) -c -o $@ $<
> +
> +demo-vtracef: demo-vtracef.o
> + @if $(AM_V_P); then set -x; else echo " CCLD $@"; fi; \
> + $(CC) $(LDFLAGS) $(AM_CFLAGS) $(AM_LDFLAGS) $(CFLAGS) \
> + -o $@ $< $(LIBS)
> +
> .PHONY: clean
> clean:
> - rm -f *.o *.a demo-tracef
> + rm -f *.o *.a demo-tracef demo-vtracef
> diff --git a/doc/examples/demo-tracef/demo-vtracef.c
> b/doc/examples/demo-tracef/demo-vtracef.c
> new file mode 100644
> index 00000000..5ade85a6
> --- /dev/null
> +++ b/doc/examples/demo-tracef/demo-vtracef.c
> @@ -0,0 +1,58 @@
> +/*
> + * Copyright (C) 2020 Maxime Roussin-Belanger
> <maxime.roussinbelanger@gmail.com>
> + *
> + * 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; version 2.1 of
> + * the License.
> + *
> + * 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
> + */
> +
> +#include <stdarg.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <unistd.h>
> +
> +#include <lttng/tracef.h>
> +
> +void print_debug(const char* msg, ...)
> +{
> + va_list ap;
> + va_start(ap, msg);
> +
> + vtracef(msg, ap);
> +
> + va_end(ap);
> +}
> +
> +int main(int argc, char **argv)
> +{
> + int i;
> + int delay = 0;
> + const char *str = "mystring test";
> + long l = 0x42;
> +
> + if (argc > 2)
> + delay = atoi(argv[1]);
> +
> + fprintf(stderr, "Demo program starting.\n");
> +
> + sleep(delay);
> +
> + fprintf(stderr, "Tracing... ");
> +
> + for (i = 0; i < 5; i++) {
> + print_debug("This is a \"%s\" formatted %d event %lx", str, i, l);
> + }
> +
> + fprintf(stderr, " done.\n");
> + return 0;
> +}
> diff --git a/doc/man/tracef-tracelog-limitations.txt
> b/doc/man/tracef-tracelog-limitations.txt
> index a9491903..ad4130dd 100644
> --- a/doc/man/tracef-tracelog-limitations.txt
> +++ b/doc/man/tracef-tracelog-limitations.txt
> @@ -21,4 +21,7 @@ Thus, +{macro-name}()+ is useful for quick prototyping and
> debugging, but
> should not be considered for any permanent/serious application
> instrumentation.
>
> ++v{macro-name}()+ does not have a `STAP_PROBEV()` call, because `STAP_PROBEV()`
> +does not support `va_list`. If you need it, you should emit this call yourself.
> +
> See man:lttng-ust(3) to learn more about custom tracepoint providers.
> diff --git a/doc/man/tracef.3.txt b/doc/man/tracef.3.txt
> index 1068afad..2894ca45 100644
> --- a/doc/man/tracef.3.txt
> +++ b/doc/man/tracef.3.txt
> @@ -5,43 +5,44 @@ tracef(3)
>
> NAME
> ----
> -tracef - LTTng-UST printf(3)-like interface
> +tracef, vtracef - LTTng-UST printf(3)-like interface
>
>
> SYNOPSIS
> --------
> [verse]
> *#include <lttng/tracef.h>*
>
> [verse]
> #define *tracef*('fmt', ...)
> +#define *vtracef*('fmt', 'va_list' ap)
>
> Link with `-llttng-ust`.
>
>
> DESCRIPTION
> -----------
> The LTTng-UST `tracef()` API allows you to trace your application with
> the help of a simple man:printf(3)-like macro. The 'fmt' argument is
> passed directly to the 'fmt' parameter of man:vasprintf(3), as well as
> the optional parameters following 'fmt'.
>
> -To use `tracef()`, include `<lttng/tracef.h>` where you need it, and
> -link your application with `liblttng-ust`. See the <<example,EXAMPLE>>
> +To use `tracef()` or `vtracef()`, include `<lttng/tracef.h>` where you need it,
> +and link your application with `liblttng-ust`. See the <<example,EXAMPLE>>
> section below for a complete usage example.
>
> -Once your application is instrumented with `tracef()` calls and
> +Once your application is instrumented with `tracef()` or `vtracef()` calls and
> ready to run, use man:lttng-enable-event(1) to enable the
> `lttng_ust_tracef:*` event.
>
> The `tracef()` events contain a single field, named `msg`, which is the
> formatted string output.
>
> If you need to attach a specific log level to a `tracef()` call, use
> man:tracelog(3) instead.
>
> See also the <<limitations,LIMITATIONS>> section below for important
> -limitations to consider when using `tracef()`.
> +limitations to consider when using `tracef()` or `vtracef()`.
>
>
> [[example]]
> diff --git a/include/lttng/tracef.h b/include/lttng/tracef.h
> index 0c59c9ae..854ccdce 100644
> --- a/include/lttng/tracef.h
> +++ b/include/lttng/tracef.h
> @@ -32,13 +32,21 @@ extern "C" {
> extern
> void _lttng_ust_tracef(const char *fmt, ...);
>
> +extern
> +void _lttng_ust_vtracef(const char *fmt, va_list ap);
> +
> #define tracef(fmt, ...) \
> do { \
> LTTNG_STAP_PROBEV(tracepoint_lttng_ust_tracef, event, ## __VA_ARGS__); \
> if (caa_unlikely(__tracepoint_lttng_ust_tracef___event.state)) \
> _lttng_ust_tracef(fmt, ## __VA_ARGS__); \
> } while (0)
>
> +#define vtracef(fmt, ap) \
> + do { \
> + if (caa_unlikely(__tracepoint_lttng_ust_tracef___event.state)) \
> + _lttng_ust_vtracef(fmt, ap); \
> + } while (0)
> #ifdef __cplusplus
> }
> #endif
> diff --git a/liblttng-ust/tracef.c b/liblttng-ust/tracef.c
> index ea98e43e..28a5e05b 100644
> --- a/liblttng-ust/tracef.c
> +++ b/liblttng-ust/tracef.c
> @@ -29,20 +29,32 @@
> #define TRACEPOINT_DEFINE
> #include "lttng-ust-tracef-provider.h"
>
> -void _lttng_ust_tracef(const char *fmt, ...)
> +static inline __attribute__((always_inline))
> +void __lttng_ust_vtracef(const char *fmt, va_list ap)
> {
> - va_list ap;
> char *msg;
> - int len;
> -
> - va_start(ap, fmt);
> - len = vasprintf(&msg, fmt, ap);
> + const int len = vasprintf(&msg, fmt, ap);
> /* len does not include the final \0 */
> if (len < 0)
> goto end;
> __tracepoint_cb_lttng_ust_tracef___event(msg, len,
> LTTNG_UST_CALLER_IP());
> free(msg);
> end:
> + return;
> +}
> +
> +void _lttng_ust_vtracef(const char *fmt, va_list ap)
> +{
> + __lttng_ust_vtracef(fmt, ap);
> +}
> +
> +void _lttng_ust_tracef(const char *fmt, ...)
> +{
> + va_list ap;
> +
> + va_start(ap, fmt);
> + __lttng_ust_vtracef(fmt, ap);
> +
> va_end(ap);
> }
> --
> 2.20.1
>
> _______________________________________________
> lttng-dev mailing list
> lttng-dev@lists.lttng.org
> https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-03-04 15:27 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-03 23:10 [PATCH v4 lttng-ust 1/2] Introduce vtracef Maxime Roussin-Belanger
2020-03-03 23:10 ` [PATCH v4 lttng-ust 2/2] Introduce vtracelog Maxime Roussin-Belanger
2020-03-04 15:27 ` [PATCH v4 lttng-ust 1/2] Introduce vtracef Mathieu Desnoyers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).