eCos applications and components can be debugged in traditional ways, with printing statements and debugger single-stepping, but there are situations in which these techniques cannot be used. One example of this is when a program is getting data at a high rate from a real-time source, and cannot be slowed down or interrupted.
eCos’s infrastructure module provides a tracing formalism, allowing the kernel’s tracing macros to be configured in many useful ways. eCos’s kernel provides instrumentation buffers which also collect specific (configurable) data about the system’s history and performance.
To use eCos’s tracing facilities you must first configure your system to use tracing. You should enable the Asserts and Tracing component (CYGPKG_INFRA_DEBUG) and the Use tracing component within it (CYGDBG_USE_TRACING). These options can be enabled with the Configuration Tool or by editing the file BUILD_DIR/pkgconf/infra.h manually.
You should then examine all the tracing-related options in the Package: Infrastructure chapter of the eCos Reference Manual. One useful set of configuration options are: CYGDBG_INFRA_DEBUG_FUNCTION_REPORTS and CYGDBG_INFRA_DEBUG_TRACE_MESSAGE, which are both enabled by default when tracing is enabled.
The following “Hello world with tracing” shows the output from running the hello world program (from the section called eCos Hello World in Chapter 13) that was built with tracing enabled:
Example 27-1. Hello world with tracing
$ mips-tx39-elf-run --board=jmr3904 hello Hello, eCos world! ASSERT FAIL: <2>cyg_trac.h [ 623] Cyg_TraceFunction_Report_::set_exitvoid() exitvoid used in typed function TRACE: <1>mlqueue.cxx [ 395] Cyg_ThreadQueue_Implementation::enqueue() {{enter TRACE: <1>mlqueue.cxx [ 395] Cyg_ThreadQueue_Implementation::enqueue() }}RETURNING UNSET! TRACE: <1>mlqueue.cxx [ 126] Cyg_Scheduler_Implementation::add_thread() }}RETURNING UNSET! TRACE: <1>thread.cxx [ 654] Cyg_Thread::resume() }}return void TRACE: <1>cstartup.cxx [ 160] cyg_iso_c_start() }}return void TRACE: <1>startup.cxx [ 142] cyg_package_start() }}return void TRACE: <1>startup.cxx [ 150] cyg_user_start() {{enter TRACE: <1>startup.cxx [ 150] cyg_user_start() (((void))) TRACE: <1>startup.cxx [ 153] cyg_user_start() 'This is the system default cyg_user_start()' TRACE: <1>startup.cxx [ 157] cyg_user_start() }}return void TRACE: <1>sched.cxx [ 212] Cyg_Scheduler::start() {{enter TRACE: <1>mlqueue.cxx [ 102] Cyg_Scheduler_Implementation::schedule() {{enter TRACE: <1>mlqueue.cxx [ 437] Cyg_ThreadQueue_Implementation::highpri() {{enter TRACE: <1>mlqueue.cxx [ 437] Cyg_ThreadQueue_Implementation::highpri() }}RETURNING UNSET! TRACE: <1>mlqueue.cxx [ 102] Cyg_Scheduler_Implementation::schedule() }}RETURNING UNSET! TRACE: <2>intr.cxx [ 450] Cyg_Interrupt::enable_interrupts() {{enter TRACE: <2>intr.cxx [ 450] Cyg_Interrupt::enable_interrupts() }}RETURNING UNSET! TRACE: <2>thread.cxx [ 69] Cyg_HardwareThread::thread_entry() {{enter TRACE: <2>cstartup.cxx [ 127] invoke_main() {{enter TRACE: <2>cstartup.cxx [ 127] invoke_main() ((argument is ignored)) TRACE: <2>dummyxxmain.cxx [ 60] __main() {{enter TRACE: <2>dummyxxmain.cxx [ 60] __main() (((void))) TRACE: <2>dummyxxmain.cxx [ 63] __main() 'This is the system default __main()' TRACE: <2>dummyxxmain.cxx [ 67] __main() }}return void TRACE: <2>memcpy.c [ 112] _memcpy() {{enter TRACE: <2>memcpy.c [ 112] _memcpy() ((dst=80002804, src=BFC14E58, n=19)) TRACE: <2>memcpy.c [ 164] _memcpy() }}returning 80002804 TRACE: <2>cstartup.cxx [ 137] invoke_main() 'main() has returned with code 0. Calling exit()' TRACE: <2>exit.cxx [ 71] __libc_exit() {{enter TRACE: <2>exit.cxx [ 71] __libc_exit() ((status=0 )) TRACE: <2>atexit.cxx [ 84] cyg_libc_invoke_atexit_handlers() {{enter TRACE: <2>atexit.cxx [ 84] cyg_libc_invoke_atexit_handlers() (((void))) Scheduler: Lock: 0 Current Thread: <null> Threads: Idle Thread pri = 31 state = R id = 1 stack base = 800021F0 ptr = 80002510 size = 00000400 sleep reason NONE wake reason NONE queue = 80000C54 wait info = 00000000 <null> pri = 0 state = R id = 2 stack base = 80002A48 ptr = 8000A968 size = 00008000 sleep reason NONE wake reason NONE queue = 80000BD8 wait info = 00000000 |