From mboxrd@z Thu Jan 1 00:00:00 1970 From: zifeitong@gmail.com (Zifei Tong) Date: Thu, 25 Jun 2015 13:55:13 +0800 Subject: [lttng-dev] LTTng c++ loglevel not being set In-Reply-To: References: Message-ID: Hi, I can confirm this issue (w/ lttng master HEAD + gcc 5.1). In include/lttng/ust-tracepoint-event.h, we have #define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ static const int * \ __ref_loglevel___##_provider##___##_name \ __attribute__((weakref ("_loglevel___" #_provider "___" #_name))); \ static const char * \ __ref_model_emf_uri___##_provider##___##_name \ __attribute__((weakref ("_model_emf_uri___" #_provider "___" #_name)));\ I think the weakref attributes used here should use mangled symbol name when compiling with C++. A workaround is attached. However, I don't know how to disable symbol mangling for a static variable, therefore the 'static' attribute is dropped. I am not sure whether exporting the symbol will cause other issues. diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 6632f67..7356451 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -676,9 +676,14 @@ const char __tp_event_signature___##_provider##___##_name[] = \ #include #undef TRACEPOINT_LOGLEVEL + +#ifdef __cplusplus +#define DISABLE_MANGLING extern "C" +#endif + #define TRACEPOINT_LOGLEVEL(__provider, __name, __loglevel) \ static const int _loglevel_value___##__provider##___##__name = __loglevel; \ -static const int *_loglevel___##__provider##___##__name = \ +DISABLE_MANGLING const int *_loglevel___##__provider##___##__name = \ &_loglevel_value___##__provider##___##__name; #include TRACEPOINT_INCLUDE Thanks, Zifei On Thu, Jun 25, 2015 at 9:42 AM, Jeffrey Chen wrote: > > I noticed a macro issue with LTTng under C++. The TRACEPOINT_LOGLEVEL would be ignored. > > Here are my steps to repro the issue. My .tp file has the TRACEPOINT_LOGLEVEL macro set. > 1. I generated the hello-tp.c file from the hello-tp.tp file using the lttng-gen-tp tool. > 2. I renamed the generated .c file into .cpp and compiled with `g++ -c -I. hello-tp.cpp` > 3. I wrote my c++ code called and call tracepoint macro, saved to hello.cpp, compiled with `g++ -c -I. hello.cpp` > 4. I compile to an executable with `g++ -o hello hello.o hello-tp.o -llttng-ust -ldl` > 5. I run the executable, and noticed the loglevel I set in the .tp file is not working. All the traces are still being written as default loglevel TRACE_DEBUG_LINE. > > I tried confirming it by using `lttng list --userspace` command and I see "hello_world:my_first_tracepoint (loglevel: TRACE_DEBUG_LINE (13)) (type: tracepoint)" > You could see the loglevel was not set. > > I tried the same steps without renaming to cpp files and build with `gcc` command and it works fine. I also tried without renaming to cpp files but compiled with `g++` command, but it also does not work. It seems to have something to do with c++ name mangling. Anyone noticed this issue? Thanks. > > _______________________________________________ > lttng-dev mailing list > lttng-dev at lists.lttng.org > http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev >