<!-- Copyright (C) 2003 Red Hat, Inc. -->
|
<!-- Copyright (C) 2003 Red Hat, Inc. -->
|
<!-- This material may be distributed only subject to the terms -->
|
<!-- This material may be distributed only subject to the terms -->
|
<!-- and conditions set forth in the Open Publication License, v1.0 -->
|
<!-- and conditions set forth in the Open Publication License, v1.0 -->
|
<!-- or later (the latest version is presently available at -->
|
<!-- or later (the latest version is presently available at -->
|
<!-- http://www.opencontent.org/openpub/). -->
|
<!-- http://www.opencontent.org/openpub/). -->
|
<!-- Distribution of the work or derivative of the work in any -->
|
<!-- Distribution of the work or derivative of the work in any -->
|
<!-- standard (paper) book form is prohibited unless prior -->
|
<!-- standard (paper) book form is prohibited unless prior -->
|
<!-- permission is obtained from the copyright holder. -->
|
<!-- permission is obtained from the copyright holder. -->
|
<HTML
|
<HTML
|
><HEAD
|
><HEAD
|
><TITLE
|
><TITLE
|
>Debugging Techniques</TITLE
|
>Debugging Techniques</TITLE
|
><meta name="MSSmartTagsPreventParsing" content="TRUE">
|
><meta name="MSSmartTagsPreventParsing" content="TRUE">
|
<META
|
<META
|
NAME="GENERATOR"
|
NAME="GENERATOR"
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
|
"><LINK
|
"><LINK
|
REL="HOME"
|
REL="HOME"
|
TITLE="eCos User Guide"
|
TITLE="eCos User Guide"
|
HREF="ecos-user-guide.html"><LINK
|
HREF="ecos-user-guide.html"><LINK
|
REL="UP"
|
REL="UP"
|
TITLE="eCos Programming Concepts and Techniques"
|
TITLE="eCos Programming Concepts and Techniques"
|
HREF="ecos-programming-concepts-and-techniques.html"><LINK
|
HREF="ecos-programming-concepts-and-techniques.html"><LINK
|
REL="PREVIOUS"
|
REL="PREVIOUS"
|
TITLE="Compiling a C++ Application"
|
TITLE="Compiling a C++ Application"
|
HREF="compiling-cpp-app.html"><LINK
|
HREF="compiling-cpp-app.html"><LINK
|
REL="NEXT"
|
REL="NEXT"
|
TITLE="Kernel Instrumentation"
|
TITLE="Kernel Instrumentation"
|
HREF="kernel-instrumentation.html"></HEAD
|
HREF="kernel-instrumentation.html"></HEAD
|
><BODY
|
><BODY
|
CLASS="CHAPTER"
|
CLASS="CHAPTER"
|
BGCOLOR="#FFFFFF"
|
BGCOLOR="#FFFFFF"
|
TEXT="#000000"
|
TEXT="#000000"
|
LINK="#0000FF"
|
LINK="#0000FF"
|
VLINK="#840084"
|
VLINK="#840084"
|
ALINK="#0000FF"
|
ALINK="#0000FF"
|
><DIV
|
><DIV
|
CLASS="NAVHEADER"
|
CLASS="NAVHEADER"
|
><TABLE
|
><TABLE
|
SUMMARY="Header navigation table"
|
SUMMARY="Header navigation table"
|
WIDTH="100%"
|
WIDTH="100%"
|
BORDER="0"
|
BORDER="0"
|
CELLPADDING="0"
|
CELLPADDING="0"
|
CELLSPACING="0"
|
CELLSPACING="0"
|
><TR
|
><TR
|
><TH
|
><TH
|
COLSPAN="3"
|
COLSPAN="3"
|
ALIGN="center"
|
ALIGN="center"
|
>eCos User Guide</TH
|
>eCos User Guide</TH
|
></TR
|
></TR
|
><TR
|
><TR
|
><TD
|
><TD
|
WIDTH="10%"
|
WIDTH="10%"
|
ALIGN="left"
|
ALIGN="left"
|
VALIGN="bottom"
|
VALIGN="bottom"
|
><A
|
><A
|
HREF="compiling-cpp-app.html"
|
HREF="compiling-cpp-app.html"
|
ACCESSKEY="P"
|
ACCESSKEY="P"
|
>Prev</A
|
>Prev</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="80%"
|
WIDTH="80%"
|
ALIGN="center"
|
ALIGN="center"
|
VALIGN="bottom"
|
VALIGN="bottom"
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="10%"
|
WIDTH="10%"
|
ALIGN="right"
|
ALIGN="right"
|
VALIGN="bottom"
|
VALIGN="bottom"
|
><A
|
><A
|
HREF="kernel-instrumentation.html"
|
HREF="kernel-instrumentation.html"
|
ACCESSKEY="N"
|
ACCESSKEY="N"
|
>Next</A
|
>Next</A
|
></TD
|
></TD
|
></TR
|
></TR
|
></TABLE
|
></TABLE
|
><HR
|
><HR
|
ALIGN="LEFT"
|
ALIGN="LEFT"
|
WIDTH="100%"></DIV
|
WIDTH="100%"></DIV
|
><DIV
|
><DIV
|
CLASS="CHAPTER"
|
CLASS="CHAPTER"
|
><H1
|
><H1
|
><A
|
><A
|
NAME="DEBUGGING-TECHNIQUES">Chapter 27. Debugging Techniques</H1
|
NAME="DEBUGGING-TECHNIQUES">Chapter 27. Debugging Techniques</H1
|
><DIV
|
><DIV
|
CLASS="TOC"
|
CLASS="TOC"
|
><DL
|
><DL
|
><DT
|
><DT
|
><B
|
><B
|
>Table of Contents</B
|
>Table of Contents</B
|
></DT
|
></DT
|
><DT
|
><DT
|
><A
|
><A
|
HREF="debugging-techniques.html#TRACING"
|
HREF="debugging-techniques.html#TRACING"
|
>Tracing</A
|
>Tracing</A
|
></DT
|
></DT
|
><DT
|
><DT
|
><A
|
><A
|
HREF="kernel-instrumentation.html"
|
HREF="kernel-instrumentation.html"
|
>Kernel Instrumentation</A
|
>Kernel Instrumentation</A
|
></DT
|
></DT
|
></DL
|
></DL
|
></DIV
|
></DIV
|
><P
|
><P
|
><SPAN
|
><SPAN
|
CLASS="PRODUCTNAME"
|
CLASS="PRODUCTNAME"
|
>eCos</SPAN
|
>eCos</SPAN
|
> applications and components can be debugged in
|
> applications and components can be debugged in
|
traditional ways, with printing statements and debugger
|
traditional ways, with printing statements and debugger
|
single-stepping, but there are situations in which these
|
single-stepping, but there are situations in which these
|
techniques cannot be used. One example of this is when a
|
techniques cannot be used. One example of this is when a
|
program is getting data at a high rate from a real-time
|
program is getting data at a high rate from a real-time
|
source, and cannot be slowed down or interrupted.</P
|
source, and cannot be slowed down or interrupted.</P
|
><P
|
><P
|
><SPAN
|
><SPAN
|
CLASS="PRODUCTNAME"
|
CLASS="PRODUCTNAME"
|
>eCos</SPAN
|
>eCos</SPAN
|
>’s infrastructure module provides a
|
>’s infrastructure module provides a
|
<SPAN
|
<SPAN
|
CLASS="emphasis"
|
CLASS="emphasis"
|
><I
|
><I
|
CLASS="EMPHASIS"
|
CLASS="EMPHASIS"
|
>tracing</I
|
>tracing</I
|
></SPAN
|
></SPAN
|
> formalism, allowing the
|
> formalism, allowing the
|
kernel’s tracing macros to be configured in many useful
|
kernel’s tracing macros to be configured in many useful
|
ways. <SPAN
|
ways. <SPAN
|
CLASS="PRODUCTNAME"
|
CLASS="PRODUCTNAME"
|
>eCos</SPAN
|
>eCos</SPAN
|
>’s kernel provides <I
|
>’s kernel provides <I
|
CLASS="FIRSTTERM"
|
CLASS="FIRSTTERM"
|
>instrumentation
|
>instrumentation
|
buffers</I
|
buffers</I
|
> which also collect specific
|
> which also collect specific
|
(configurable) data about the system’s history and
|
(configurable) data about the system’s history and
|
performance.</P
|
performance.</P
|
><DIV
|
><DIV
|
CLASS="SECT1"
|
CLASS="SECT1"
|
><H1
|
><H1
|
CLASS="SECT1"
|
CLASS="SECT1"
|
><A
|
><A
|
NAME="TRACING">Tracing</H1
|
NAME="TRACING">Tracing</H1
|
><P
|
><P
|
>To use <SPAN
|
>To use <SPAN
|
CLASS="PRODUCTNAME"
|
CLASS="PRODUCTNAME"
|
>eCos</SPAN
|
>eCos</SPAN
|
>’s tracing facilities you must first
|
>’s tracing facilities you must first
|
configure your system to use <I
|
configure your system to use <I
|
CLASS="FIRSTTERM"
|
CLASS="FIRSTTERM"
|
>tracing</I
|
>tracing</I
|
>.
|
>.
|
You should enable the Asserts and Tracing component
|
You should enable the Asserts and Tracing component
|
(<TT
|
(<TT
|
CLASS="OPTION"
|
CLASS="OPTION"
|
>CYGPKG_INFRA_DEBUG</TT
|
>CYGPKG_INFRA_DEBUG</TT
|
>) and the
|
>) and the
|
<TT
|
<TT
|
CLASS="OPTION"
|
CLASS="OPTION"
|
>Use tracing</TT
|
>Use tracing</TT
|
> component within it
|
> component within it
|
(<TT
|
(<TT
|
CLASS="OPTION"
|
CLASS="OPTION"
|
>CYGDBG_USE_TRACING</TT
|
>CYGDBG_USE_TRACING</TT
|
>). These
|
>). These
|
options can be enabled with the <SPAN
|
options can be enabled with the <SPAN
|
CLASS="APPLICATION"
|
CLASS="APPLICATION"
|
>Configuration
|
>Configuration
|
Tool</SPAN
|
Tool</SPAN
|
> or by editing the file
|
> or by editing the file
|
<TT
|
<TT
|
CLASS="FILENAME"
|
CLASS="FILENAME"
|
><TT
|
><TT
|
CLASS="REPLACEABLE"
|
CLASS="REPLACEABLE"
|
><I
|
><I
|
>BUILD_DIR</I
|
>BUILD_DIR</I
|
></TT
|
></TT
|
>/pkgconf/infra.h
|
>/pkgconf/infra.h
|
</TT
|
</TT
|
> manually.</P
|
> manually.</P
|
><P
|
><P
|
>You should then examine all the tracing-related options in
|
>You should then examine all the tracing-related options in
|
the <I
|
the <I
|
CLASS="CITETITLE"
|
CLASS="CITETITLE"
|
>Package: Infrastructure</I
|
>Package: Infrastructure</I
|
> chapter of the <I
|
> chapter of the <I
|
CLASS="CITETITLE"
|
CLASS="CITETITLE"
|
><SPAN
|
><SPAN
|
CLASS="PRODUCTNAME"
|
CLASS="PRODUCTNAME"
|
>eCos</SPAN
|
>eCos</SPAN
|
> Reference
|
> Reference
|
Manual</I
|
Manual</I
|
>. One useful set of configuration options are: <TT
|
>. One useful set of configuration options are: <TT
|
CLASS="LITERAL"
|
CLASS="LITERAL"
|
>CYGDBG_INFRA_DEBUG_FUNCTION_REPORTS</TT
|
>CYGDBG_INFRA_DEBUG_FUNCTION_REPORTS</TT
|
> and <TT
|
> and <TT
|
CLASS="LITERAL"
|
CLASS="LITERAL"
|
>CYGDBG_INFRA_DEBUG_TRACE_MESSAGE</TT
|
>CYGDBG_INFRA_DEBUG_TRACE_MESSAGE</TT
|
>,
|
>,
|
which are both enabled by default when tracing is enabled.</P
|
which are both enabled by default when tracing is enabled.</P
|
><P
|
><P
|
>The following “Hello world with tracing” shows
|
>The following “Hello world with tracing” shows
|
the output from running the hello world program (from <A
|
the output from running the hello world program (from <A
|
HREF="building-and-running-sample-appliations.html#ECOS-HELLO-WORLD"
|
HREF="building-and-running-sample-appliations.html#ECOS-HELLO-WORLD"
|
>the Section called <I
|
>the Section called <I
|
><SPAN
|
><SPAN
|
CLASS="PRODUCTNAME"
|
CLASS="PRODUCTNAME"
|
>eCos</SPAN
|
>eCos</SPAN
|
> Hello World</I
|
> Hello World</I
|
> in Chapter 13</A
|
> in Chapter 13</A
|
>) that was
|
>) that was
|
built with tracing enabled: </P
|
built with tracing enabled: </P
|
><DIV
|
><DIV
|
CLASS="EXAMPLE"
|
CLASS="EXAMPLE"
|
><A
|
><A
|
NAME="AEN2289"><P
|
NAME="AEN2289"><P
|
><B
|
><B
|
>Example 27-1. Hello world with tracing</B
|
>Example 27-1. Hello world with tracing</B
|
></P
|
></P
|
><TABLE
|
><TABLE
|
BORDER="5"
|
BORDER="5"
|
BGCOLOR="#E0E0F0"
|
BGCOLOR="#E0E0F0"
|
WIDTH="70%"
|
WIDTH="70%"
|
><TR
|
><TR
|
><TD
|
><TD
|
><PRE
|
><PRE
|
CLASS="SCREEN"
|
CLASS="SCREEN"
|
>$ mips-tx39-elf-run --board=jmr3904 hello
|
>$ mips-tx39-elf-run --board=jmr3904 hello
|
Hello, eCos world!
|
Hello, eCos world!
|
ASSERT FAIL: <2>cyg_trac.h [ 623] Cyg_TraceFunction_Report_::set_exitvoid() exitvoid used in typed function
|
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() {{enter
|
TRACE: <1>mlqueue.cxx [ 395] Cyg_ThreadQueue_Implementation::enqueue() }}RETURNING UNSET!
|
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>mlqueue.cxx [ 126] Cyg_Scheduler_Implementation::add_thread() }}RETURNING UNSET!
|
TRACE: <1>thread.cxx [ 654] Cyg_Thread::resume() }}return void
|
TRACE: <1>thread.cxx [ 654] Cyg_Thread::resume() }}return void
|
TRACE: <1>cstartup.cxx [ 160] cyg_iso_c_start() }}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 [ 142] cyg_package_start() }}return void
|
TRACE: <1>startup.cxx [ 150] cyg_user_start() {{enter
|
TRACE: <1>startup.cxx [ 150] cyg_user_start() {{enter
|
TRACE: <1>startup.cxx [ 150] cyg_user_start() (((void)))
|
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 [ 153] cyg_user_start() 'This is the system default cyg_user_start()'
|
TRACE: <1>startup.cxx [ 157] cyg_user_start() }}return void
|
TRACE: <1>startup.cxx [ 157] cyg_user_start() }}return void
|
TRACE: <1>sched.cxx [ 212] Cyg_Scheduler::start() {{enter
|
TRACE: <1>sched.cxx [ 212] Cyg_Scheduler::start() {{enter
|
TRACE: <1>mlqueue.cxx [ 102] Cyg_Scheduler_Implementation::schedule() {{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() {{enter
|
TRACE: <1>mlqueue.cxx [ 437] Cyg_ThreadQueue_Implementation::highpri() }}RETURNING UNSET!
|
TRACE: <1>mlqueue.cxx [ 437] Cyg_ThreadQueue_Implementation::highpri() }}RETURNING UNSET!
|
TRACE: <1>mlqueue.cxx [ 102] Cyg_Scheduler_Implementation::schedule() }}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() {{enter
|
TRACE: <2>intr.cxx [ 450] Cyg_Interrupt::enable_interrupts() }}RETURNING UNSET!
|
TRACE: <2>intr.cxx [ 450] Cyg_Interrupt::enable_interrupts() }}RETURNING UNSET!
|
TRACE: <2>thread.cxx [ 69] Cyg_HardwareThread::thread_entry() {{enter
|
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() {{enter
|
TRACE: <2>cstartup.cxx [ 127] invoke_main() ((argument is ignored))
|
TRACE: <2>cstartup.cxx [ 127] invoke_main() ((argument is ignored))
|
TRACE: <2>dummyxxmain.cxx [ 60] __main() {{enter
|
TRACE: <2>dummyxxmain.cxx [ 60] __main() {{enter
|
TRACE: <2>dummyxxmain.cxx [ 60] __main() (((void)))
|
TRACE: <2>dummyxxmain.cxx [ 60] __main() (((void)))
|
TRACE: <2>dummyxxmain.cxx [ 63] __main() 'This is the system default __main()'
|
TRACE: <2>dummyxxmain.cxx [ 63] __main() 'This is the system default __main()'
|
TRACE: <2>dummyxxmain.cxx [ 67] __main() }}return void
|
TRACE: <2>dummyxxmain.cxx [ 67] __main() }}return void
|
TRACE: <2>memcpy.c [ 112] _memcpy() {{enter
|
TRACE: <2>memcpy.c [ 112] _memcpy() {{enter
|
TRACE: <2>memcpy.c [ 112] _memcpy() ((dst=80002804, src=BFC14E58, n=19))
|
TRACE: <2>memcpy.c [ 112] _memcpy() ((dst=80002804, src=BFC14E58, n=19))
|
TRACE: <2>memcpy.c [ 164] _memcpy() }}returning 80002804
|
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>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() {{enter
|
TRACE: <2>exit.cxx [ 71] __libc_exit() ((status=0 ))
|
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() {{enter
|
TRACE: <2>atexit.cxx [ 84] cyg_libc_invoke_atexit_handlers() (((void)))
|
TRACE: <2>atexit.cxx [ 84] cyg_libc_invoke_atexit_handlers() (((void)))
|
|
|
Scheduler:
|
Scheduler:
|
|
|
Lock: 0
|
Lock: 0
|
Current Thread: <null>
|
Current Thread: <null>
|
|
|
Threads:
|
Threads:
|
|
|
Idle Thread pri = 31 state = R id = 1
|
Idle Thread pri = 31 state = R id = 1
|
stack base = 800021F0 ptr = 80002510 size = 00000400
|
stack base = 800021F0 ptr = 80002510 size = 00000400
|
sleep reason NONE wake reason NONE
|
sleep reason NONE wake reason NONE
|
queue = 80000C54 wait info = 00000000
|
queue = 80000C54 wait info = 00000000
|
|
|
<null> pri = 0 state = R id = 2
|
<null> pri = 0 state = R id = 2
|
stack base = 80002A48 ptr = 8000A968 size = 00008000
|
stack base = 80002A48 ptr = 8000A968 size = 00008000
|
sleep reason NONE wake reason NONE
|
sleep reason NONE wake reason NONE
|
queue = 80000BD8 wait info = 00000000
|
queue = 80000BD8 wait info = 00000000
|
</PRE
|
</PRE
|
></TD
|
></TD
|
></TR
|
></TR
|
></TABLE
|
></TABLE
|
></DIV
|
></DIV
|
></DIV
|
></DIV
|
></DIV
|
></DIV
|
><DIV
|
><DIV
|
CLASS="NAVFOOTER"
|
CLASS="NAVFOOTER"
|
><HR
|
><HR
|
ALIGN="LEFT"
|
ALIGN="LEFT"
|
WIDTH="100%"><TABLE
|
WIDTH="100%"><TABLE
|
SUMMARY="Footer navigation table"
|
SUMMARY="Footer navigation table"
|
WIDTH="100%"
|
WIDTH="100%"
|
BORDER="0"
|
BORDER="0"
|
CELLPADDING="0"
|
CELLPADDING="0"
|
CELLSPACING="0"
|
CELLSPACING="0"
|
><TR
|
><TR
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="left"
|
ALIGN="left"
|
VALIGN="top"
|
VALIGN="top"
|
><A
|
><A
|
HREF="compiling-cpp-app.html"
|
HREF="compiling-cpp-app.html"
|
ACCESSKEY="P"
|
ACCESSKEY="P"
|
>Prev</A
|
>Prev</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="34%"
|
WIDTH="34%"
|
ALIGN="center"
|
ALIGN="center"
|
VALIGN="top"
|
VALIGN="top"
|
><A
|
><A
|
HREF="ecos-user-guide.html"
|
HREF="ecos-user-guide.html"
|
ACCESSKEY="H"
|
ACCESSKEY="H"
|
>Home</A
|
>Home</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="right"
|
ALIGN="right"
|
VALIGN="top"
|
VALIGN="top"
|
><A
|
><A
|
HREF="kernel-instrumentation.html"
|
HREF="kernel-instrumentation.html"
|
ACCESSKEY="N"
|
ACCESSKEY="N"
|
>Next</A
|
>Next</A
|
></TD
|
></TD
|
></TR
|
></TR
|
><TR
|
><TR
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="left"
|
ALIGN="left"
|
VALIGN="top"
|
VALIGN="top"
|
>Compiling a C++ Application</TD
|
>Compiling a C++ Application</TD
|
><TD
|
><TD
|
WIDTH="34%"
|
WIDTH="34%"
|
ALIGN="center"
|
ALIGN="center"
|
VALIGN="top"
|
VALIGN="top"
|
><A
|
><A
|
HREF="ecos-programming-concepts-and-techniques.html"
|
HREF="ecos-programming-concepts-and-techniques.html"
|
ACCESSKEY="U"
|
ACCESSKEY="U"
|
>Up</A
|
>Up</A
|
></TD
|
></TD
|
><TD
|
><TD
|
WIDTH="33%"
|
WIDTH="33%"
|
ALIGN="right"
|
ALIGN="right"
|
VALIGN="top"
|
VALIGN="top"
|
>Kernel Instrumentation</TD
|
>Kernel Instrumentation</TD
|
></TR
|
></TR
|
></TABLE
|
></TABLE
|
></DIV
|
></DIV
|
></BODY
|
></BODY
|
></HTML
|
></HTML
|
|
|