[ltt-dev] UST - Problems in recording trace on a current process
Pierre-Marc Fournier
pierre-marc.fournier at polymtl.ca
Tue Feb 9 16:28:09 EST 2010
On February 9, 2010 15:40:50 Naren wrote:
> Hi Pierre,
>
> >>- the program you want to trace has been linked dynamically against
>
> libust.
>
> >>You can do so with the ldd tool
>
> The program i want to trace is firefox with pid 1684.
>
> Here are the results of ldd'ing firefox
>
> *root at naren-laptop:/tmp# ldd /usr/lib/firefox-3.5.7/firefox-3.5*
> * **linux-gate.so.1 => (0xb7f27000)*
> * **libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7efc000)*
> * **libasound.so.2 => /usr/lib/libasound.so.2 (0xb7e35000)*
> * **libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7e30000)*
> * **libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7d3e000)*
> * **libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7d18000)*
> * **libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7cfa000)*
> * **libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7bb5000)*
> * **/lib/ld-linux.so.2 (0xb7f28000)*
> * **librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7bab000)*
So we have the answer to your problem. You cannot list the markers on your
program (firefox) because it was not linked with libust. Linking a program to
libust is essential in order to be able to trace it or to list markers.
There are two ways of doing this. Either you can link it with the gcc
option -lust at compile time, or you can link it at runtime using LD_PRELOAD.
For example:
LD_PRELOAD=/path/to/libust.so ./myprogram
Without libust, the listener thread won't be created and the program will
never create a socket in /tmp/ust-app-socks, hence your error message about
the socket not being found.
Another way to do the LD_PRELOAD trick is to use usttrace, which will do it
automatically with -l:
usttrace -l ./myprogram
Of course you need to add some instrumentation to firefox or to the libraries
it's linked to, to see something interesting in the trace. Using the -m
option to ustctl you can automatically instrument calls to malloc() and
free() at the cost of an additional function call each time they are called.
Also note that firefox uses fork() and clone(). Because of this, you'll need
to use libinterfork. This library intercepts calls to fork() and clone() and
sets up the trace correctly in the new processes. You can use it with
usttrace -f. This is a bit described in manual section "5.5 Tracing across
fork() and clone()" (at http://lttng.org/files/ust/manual/ust.html) but it's
still missing information... and it could probably use more testing.
>
> >>you did a "make install" when you upgraded your ust. You would get this
> >>error if ustctl and your traced program were linked against different
> >>versions of libust.so
>
> For what i infer, none of these are hooked up with libust. Have i missed
> out any because i didn't even have the opportunity of starting a trace on
> firefox, since i was not able to list markers.
>
> *Moreover, another unrelated nitpick.*
>
> In the manual http://lttng.org/files/ust/manual/ust.html, under section
> "5.2 Setting up the recording manually", the command given to enable
> markers "$ ustctl --enable-marker 1234 ust/mymark" . However, after some
> reverse engineering, i found out that "parse_opts_long" function "ustctl.c"
> file expects pid to be the last argument and it is giving
> "*ustctl[1813/1813]: Error: The pid "ust/1" is invalid. (in
> parse_opts_long() at ustctl.c:159)*" error. Hence it would be "$ ustctl
> --enable-marker ust/mymark 1234". I am not sure of this though. Can you
> clarify?
You are absolutely right. It's now fixed. Thanks for reporting this!
pmf
More information about the lttng-dev
mailing list