What you will typically want is to read sections 2 and 3 : install LTTng from
sources and use it.
-These operations are made for installing the LTTng 0.5.X tracer on a
+These operations are made for installing the LTTng 0.6.X tracer on a
linux 2.6.X kernel. You will also find instructions for installation of
LTTV 0.8.x : the Linux Trace Toolkit Viewer.
Select the following options :
[*] Linux Trace Toolkit Instrumentation Support
<M> or <*> Linux Trace Toolkit Tracer
+ <M> or <*> Linux Trace Toolkit Relay+DebugFS Support
It makes no difference for the rest of the procedure whether the Tracer
is compiled built-in or as a module.
activate :
[*] Align Linux Trace Toolkit Traces
[*] Allow tracing from userspace
+ <M> Linux Trace Toolkit Netlink Controller
+ <M> Linux Trace Toolkit State Dump
your choice (see < Help >) :
[ ] Activate Linux Trace Toolkit Heartbeat Timer
- You may or may not activate instrumentation per facility. They are all
- selected for logging by default. It can be used as a compile time filter to
- enable/disable logging of events. It is useful to discard events with a
- minimal impact on the system and especially useful for now, as the dynamic
- filter has not been implemented yet.
- Select <Exit>
+ You may or may not decide to compile probes. Afterward, you will have to
+ load the probe modules to enable tracing of their events. The probes
+ automatically select the appropriate facilities.
+ Static instrumentation is a more invasive type of instrumentation that gives
+ the address taking a lock or doing a printk.
+ Select <Exit>
Select <Exit>
Select <Yes>
make
mount /mnt/debugfs
-You need to load the ltt-control module to be able to control tracing from user
+You need to load the LTT modules to be able to control tracing from user
space. This is done by issuing the command :
modprobe ltt-control
modprobe ltt-core
modprobe ltt-relay
+modprobe ltt-tracer
+modprobe ltt-probe-mm
+modprobe ltt-probe-kernel
+modprobe ltt-probe-i386 (or x86_64, powerpc, ppc, arm, mips)
+modprobe ltt-probe-net
+modprobe ltt-probe-list
+modprobe ltt-probe-ipc
+modprobe ltt-probe-fs
If you want to have complete information about the kernel state (including all
the process names), you need to load the ltt-statedump module. This is done by
You can automate at boot time loading the ltt-control module by :
+cp /etc/modules /etc/modules.bkp
echo ltt-control >> /etc/modules
echo ltt-core >> /etc/modules
echo ltt-relay >> /etc/modules
+echo ltt-tracer >> /etc/modules
+echo ltt-probe-mm >> /etc/modules
+echo ltt-probe-kernel >> /etc/modules
+echo ltt-probe-i386 >> /etc/modules (or x86_64, powerpc, ppc, arm, mips)
+echo ltt-probe-net >> /etc/modules
+echo ltt-probe-list >> /etc/modules
+echo ltt-probe-ipc >> /etc/modules
+echo ltt-probe-fs >> /etc/modules
echo ltt-statedump >> /etc/modules
+(note : if you want to probe a marker which is within a module, make sure you
+load the probe _after_ the module, otherwise the probe will not be able to
+connect itself to the marker.)
+
* Getting and installing the ltt-control package (on the traced machine)
(note : the ltt-control package contains lttd and lttctl. Although it has the
see lttctl --help for details.
+(note : to see if the buffers has been filled, look at the dmesg output after
+lttctl -R or after stopping tracing from the GUI, it will show an event lost
+count. If it is the case, try using larger buffers. See lttctl --help to learn
+how.)
* Use text mode LTTV
see lttv -m textDump --help for detailed command line options of textDump.
-
+It is, in the current state of the project, very useful to use "grep" on the
+text output to filter by specific event fields. You can later copy the timestamp
+of the events to the clipboard and paste them in the GUI by clicking on the
+bottom right label "Current time". Support for this type of filtering should
+be added to the filter module soon.
***********************************************************
* Add new events to the kernel with genevent
su -
-cd /usr/local/share/LinuxTraceToolkitViewer/facilities
+cd /usr/local/share/ltt-control/facilities
cp process.xml yourfacility.xml
* edit yourfacility.xml to fit your needs.
cd /tmp
-/usr/local/bin/genevent /usr/local/share/LinuxTraceToolkitViewer/facilities/yourfacility.xml
+/usr/local/bin/genevent /usr/local/share/ltt-control/facilities/yourfacility.xml
cp ltt-facility-yourfacility.h ltt-facility-id-yourfacility.h \
- /usr/src/linux-2.6.17-lttng-0.x.xx8/include/linux/ltt
+ /usr/src/linux-2.6.17-lttng-0.x.xx8/include/ltt
cp ltt-facility-loader-yourfacility.c ltt-facility-loader-yourfacility.h \
- /usr/src/linux-2.6.17-lttng-0.x.xx/ltt
- * edit the kernel file you want to instrument
- - Add #include <linux/ltt/ltt-facility-yourfacility.h> at the beginning
- of the file.
- - Add a call to the tracing functions. See their names and parameters in
- /usr/src/linux-2.6.17-lttng-0.x.xx/include/linux/ltt/ltt-facility-yourfacility.h
-
+ /usr/src/linux-2.6.17-lttng-0.x.xx/ltt/facilities
+ * edit the kernel file you want to instrument to add a marker to it. See
+ include/linux/marker.h.
+ * create a dynamically loadable probe. See ltt/probes for examples. The probe
+ will be connected to your marker and will typically call the logging
+ functions found in the header file you created with genevent.
+
* Add new events to userspace programs with genevent
See http://ltt.polymtl.ca/ > USERSPACE TRACING QUICKSTART
return 0;
}
+/* after_statedump_end
+ *
+ * @param hook_data ControlFlowData structure of the viewer.
+ * @param call_data Event context.
+ *
+ * This function adds items to be drawn in a queue for each process.
+ *
+ */
+int before_statedump_end(void *hook_data, void *call_data)
+{
+ LttvTraceHookByFacility *thf = (LttvTraceHookByFacility*)hook_data;
+ EventsRequest *events_request = (EventsRequest*)thf->hook_data;
+ ControlFlowData *control_flow_data = events_request->viewer_data;
+
+ LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
+
+ LttvTracefileState *tfs = (LttvTracefileState *)call_data;
+
+ LttvTraceState *ts = (LttvTraceState *)tfc->t_context;
+
+ LttvTracesetState *tss = (LttvTracesetState*)tfc->t_context->ts_context;
+ ProcessList *process_list = control_flow_data->process_list;
+
+ LttEvent *e;
+ e = ltt_tracefile_get_event(tfc->tf);
+
+ LttvFilter *filter = control_flow_data->filter;
+ if(filter != NULL && filter->head != NULL)
+ if(!lttv_filter_tree_parse(filter->head,e,tfc->tf,
+ tfc->t_context->t,tfc))
+ return FALSE;
+
+ LttTime evtime = ltt_event_time(e);
+
+ ClosureData closure_data;
+ closure_data.events_request = events_request;
+ closure_data.tss = tss;
+ closure_data.end_time = evtime;
+
+ TimeWindow time_window =
+ lttvwindow_get_time_window(control_flow_data->tab);
+ guint width = control_flow_data->drawing->width;
+ convert_time_to_pixels(
+ time_window,
+ evtime,
+ width,
+ &closure_data.x_end);
+
+ /* Draw last items */
+ g_hash_table_foreach(process_list->process_hash, draw_closure,
+ (void*)&closure_data);
+#if 0
+ /* Reactivate sort */
+ gtk_tree_sortable_set_sort_column_id(
+ GTK_TREE_SORTABLE(control_flow_data->process_list->list_store),
+ GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
+ GTK_SORT_ASCENDING);
+
+ update_index_to_pixmap(control_flow_data->process_list);
+ /* Request a full expose : drawing scrambled */
+ gtk_widget_queue_draw(control_flow_data->drawing->drawing_area);
+#endif //0
+ /* Request expose (updates damages zone also) */
+ drawing_request_expose(events_request, tss, evtime);
+
+ return 0;
+}
+
+