Now we'll gather all events from only one class, _NTO_TRACE_THREAD. This class is arbitrarily chosen to demonstrate filtering by classes; there's nothing particularly special about this class versus any other. For a full list of the possible classes, see Classes and events in the Events and the Kernel chapter in this guide.
Here's the source, one_class.c:
/* * $QNXLicenseC: * Copyright 2007, QNX Software Systems. All Rights Reserved. * * You must obtain a written license from and pay applicable license fees to QNX * Software Systems before you may reproduce, modify or distribute this software, * or any work that includes all or part of this software. Free development * licenses are available for evaluation and non-commercial purposes. For more * information visit http://licensing.qnx.com or email licensing@qnx.com. * * This file may contain contributions from others. Please review this entire * file for other proprietary rights or license notices, as well as the QNX * Development Suite License Guide at http://licensing.qnx.com/license-guide/ * for other information. * $ */ #ifdef __USAGE %C - instrumentation example %C - example that illustrates the very basic use of the TraceEvent() kernel call and the instrumentation module with tracelogger in a daemon mode. Only events from the thread class (_NTO_TRACE_THREAD) are monitored (intercepted). In order to use this example, start the tracelogger in the daemon mode as: tracelogger -n iter_number -d1 with iter_number = your choice of 1 through 10 After you start the example, tracelogger will log the specified number of iterations and then terminate. There are no messages printed upon successful completion of the example. You can view the intercepted events with the traceprinter utility. See accompanied documentation and comments within the sample source code for more explanations. #endif #include <sys/trace.h> #include "instrex.h" int main(int argc, char **argv) { /* * Just in case, turn off all filters, since we * don't know their present state - go to the * known state of the filters. */ TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_DELALLCLASSES)); TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_CLRCLASSPID, _NTO_TRACE_KERCALL)); TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_CLRCLASSTID, _NTO_TRACE_KERCALL)); TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_CLRCLASSPID, _NTO_TRACE_THREAD)); TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_CLRCLASSTID, _NTO_TRACE_THREAD)); /* * Intercept only thread events */ TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_ADDCLASS, _NTO_TRACE_THREAD)); /* * Start tracing process * * During the tracing process, the tracelogger (which * is being executed in daemon mode) will log all events. * You can specify the number of iterations (i.e., the * number of kernel buffers logged) when you start tracelogger. */ TRACE_EVENT(argv[0], TraceEvent(_NTO_TRACE_START)); /* * The main() of this execution flow returns. * However, the main() function of the tracelogger * will return after registering the specified number * of events. */ return (0); }
Compile it, and then run tracelogger in one window:
tracelogger -d1 -n 3 -f one_class.kev
and run the compiled program in another:
./one_class
The trace data is in one_class.kev; to examine it, type:
traceprinter -f one_class.kev | less
The output from traceprinter will look something like this:
TRACEPRINTER version 1.02 TRACEPARSER LIBRARY version 1.02 -- HEADER FILE INFORMATION -- TRACE_FILE_NAME:: one_class.kev TRACE_DATE:: Wed Jun 24 10:55:05 2009 TRACE_VER_MAJOR:: 1 TRACE_VER_MINOR:: 01 TRACE_LITTLE_ENDIAN:: TRUE TRACE_ENCODING:: 16 byte events TRACE_BOOT_DATE:: Tue Jun 23 11:47:46 2009 TRACE_CYCLES_PER_SEC:: 736629000 TRACE_CPU_NUM:: 1 TRACE_SYSNAME:: QNX TRACE_NODENAME:: localhost TRACE_SYS_RELEASE:: 6.4.1 TRACE_SYS_VERSION:: 2009/05/20-17:35:56EDT TRACE_MACHINE:: x86pc TRACE_SYSPAGE_LEN:: 2264 TRACE_TRACELOGGER_ARGS:: tracelogger -d1 -n 3 -f one_class.kev -- KERNEL EVENTS -- t:0x002c4d55 CPU:00 CONTROL: BUFFER sequence = 37, num_events = 714 t:0x002c4d55 CPU:00 THREAD :THCREATE pid:1 tid:1 t:0x002c5531 CPU:00 THREAD :THREADY pid:1 tid:1 priority:0 policy:1 t:0x002c5bbe CPU:00 THREAD :THCREATE pid:1 tid:2 t:0x002c5cd2 CPU:00 THREAD :THRECEIVE pid:1 tid:2 priority:255 policy:2 t:0x002c6185 CPU:00 THREAD :THCREATE pid:1 tid:3 t:0x002c6272 CPU:00 THREAD :THRECEIVE pid:1 tid:3 priority:255 policy:2 t:0x002c64eb CPU:00 THREAD :THCREATE pid:1 tid:4 t:0x002c65d8 CPU:00 THREAD :THRECEIVE pid:1 tid:4 priority:10 policy:2 t:0x002c67fc CPU:00 THREAD :THCREATE pid:1 tid:5 t:0x002c68ea CPU:00 THREAD :THRECEIVE pid:1 tid:5 priority:255 policy:2 t:0x002c6bae CPU:00 THREAD :THCREATE pid:1 tid:7 t:0x002c6c9b CPU:00 THREAD :THRECEIVE pid:1 tid:7 priority:10 policy:2 t:0x002c6f03 CPU:00 THREAD :THCREATE pid:1 tid:8 t:0x002c6ff0 CPU:00 THREAD :THRECEIVE pid:1 tid:8 priority:10 policy:2 t:0x002c72ec CPU:00 THREAD :THCREATE pid:1 tid:10 t:0x002c73d9 CPU:00 THREAD :THRECEIVE pid:1 tid:10 priority:10 policy:2 t:0x002c7665 CPU:00 THREAD :THCREATE pid:1 tid:11 t:0x002c7752 CPU:00 THREAD :THRECEIVE pid:1 tid:11 priority:10 policy:2 t:0x002c7a9d CPU:00 THREAD :THCREATE pid:1 tid:12 t:0x002c7b8a CPU:00 THREAD :THRECEIVE pid:1 tid:12 priority:10 policy:2 t:0x002c7e44 CPU:00 THREAD :THCREATE pid:1 tid:15 t:0x002c7f31 CPU:00 THREAD :THRECEIVE pid:1 tid:15 priority:10 policy:2 t:0x002c81a2 CPU:00 THREAD :THCREATE pid:1 tid:20 t:0x002c828f CPU:00 THREAD :THRECEIVE pid:1 tid:20 priority:10 policy:2 t:0x002c88e3 CPU:00 THREAD :THCREATE pid:2 tid:1 t:0x002c89d3 CPU:00 THREAD :THREPLY pid:2 tid:1 priority:10 policy:3 t:0x002c8fad CPU:00 THREAD :THCREATE pid:4099 tid:1 t:0x002c909a CPU:00 THREAD :THRECEIVE pid:4099 tid:1 priority:10 policy:3 t:0x002c95b7 CPU:00 THREAD :THCREATE pid:4100 tid:1 t:0x002c96a4 CPU:00 THREAD :THRECEIVE pid:4100 tid:1 priority:10 policy:3 t:0x002c9b6e CPU:00 THREAD :THCREATE pid:4101 tid:1 t:0x002c9ccd CPU:00 THREAD :THSIGWAITINFO pid:4101 tid:1 priority:10 policy:3 ...
Notice that we've significantly reduced the amount of output.