TraceX

TRACEX SNAPSHOT

  • Visual system analysis tool for applications using ThreadX, NetX, FileX, and USBX
  • Extensive event search and navigation facilities
  • Easily measure delta time between events
  • Zoom in-out
  • Sequential and Time display modes
  • Automatically detect priority inversions
  • Easily add custom user events
  • Built-in performance analysis
    • Execution profile, including Idle and ISR time
    • Thread stack usage profile
    • Performance statistics (context-switches, etc)
    • FileX statistics (file read/writes, etc.)
    • NetX statistics (packets sent/received, etc.)
  • Multicore Support
  • Runs on any Windows host
  • No license keys

TRACEX는 실시간 시스템 이벤트를 시각적으로 확인하여 실시간 시스템의 동작을 더 이해할 수 있는
Host-based(Windows 프로그램) 분석 툴(Analyzer tool)로 개발자는 TraceX를 통해서 인터럽트
(Interrupts)나 문맥교환(Context switches)과 같은 시스템 이벤트(Events)의 발생을 확인하실 수
있습니다.

종합적으로 시스템 문맥(Context)이 발생했던 시점을 정확하게 찾아서 이벤트(events)를 확인할 수
있기 때문에 개발자는 기대하지 않은 Behavior와 방해되는 부분을 조사하여 프로그래밍 문제를 해결
하실 수 있습니다.

Trace 정보는 타겟 시스템의 버퍼에 저장됩니다. TraceX는 ThreadX, NetX, FileX, USBX에 저장된
정보 등을 버퍼에서 처리할 수 있고 Trace 정보는 분석하기 위해서 언제든(사후분석[Post mortem]
또는 Breakpoint를 걸었을 때) Host로부터 업로드 될 것입니다.

TraceX는 최신에 일어난 “N”개의 이벤트중에서 시스템 고장 이벤트나 다른 중요한 이벤트의 발생시
점검할 수 있도록 원형버퍼(Circular buffer)를 구현했습니다.

{title}

   [TraceX Single-Core Display]

 

{title}

   [TraceX Multi-Core Display]
 
 

TraceX Built-In System Analysis

: 한번의 클릭으로 시스템 분석리포트를 제공합니다.
 

{title}

 Generate multi-core CPU utilization report [Multi-Core Only]

{title}

 Generate Execution Profile report

{title}

 Generate Performance Statistics report

{title}

 Generate Thread Stack Usage report

Please see below for more details on the built-in system analysis reports.
 

Trace Data Collected By ThreadX® RTOS

: TraceX는 Express Logic사의 제품(ThreadX, NetX, FileX, USBX)에 맞게 설계되었습니다.

These events include:

  • thread context switches
  • preemptions
  • suspensions
  • terminations
  • system interrupts
  • application-specific events
  • all ThreadX API calls
  • all NetX API calls
  • all FileX API calls
  • all USBX API calls
  • Application-Defined Icons and information


이벤트는 프로그램 제어하에 Time-stamping과 Active thread identification과 함께 기록됩니다.
이를 통해서 관련 Thread의 Time sequence를 볼 수 있습니다.
  

TraceX is Like a Software Logic Analyzer

Once the event log has been uploaded from target memory to the host, TraceX displays the events graphically on a horizontal axis representing time, with the various application threads and system routines to which the events are related listed along the vertical axis. TraceX creates a “software logic analyzer” on the host, making system events plainly visible. Events are represented by color coded icons, located at the point of occurrence along the horizontal timeline, to the right of the relevant thread or system routine. When an event icon is selected, the corresponding information for that event is displayed, as well as the information for the two previous and two subsequent events. This provides quick, single-click access to the most immediate information about the event and its immediately surrounding events. TraceX provides a “Summary” display that shows all system events on a single horizontal line to simplify analysis of systems with many threads.

Sequential View Mode
The sequential view mode is selected by the “Sequential View” tab. This is the default mode. In this mode, events are shown immediately following each other—regardless of the elapsed time between them. Note also the ruler above the display area. It shows the relative event number from the beginning of the trace. This mode is the default mode and is especially useful in getting a good overview of what is going on in the system.

{title}

[System Contexts]

In this mode, events are shown in a time relative manner—with a solid green bar being used to show execution between events. This mode is especially useful to see where the bulk of processing is taking place in the system, which can help developers tune their system for greater performance and/or responsiveness.

Time View Mode

Note also the ruler above the event display. This ruler shows relative ticks from the beginning of the trace, as derived from the time stamp instrumented in the event trace logging inside of ThreadX. If the time-stamps are too close (low frequency timer), the events will run together. Conversely, if the time-stamps are too far apart (high frequency timer), then the events will be too far apart. Choosing the right frequency time stamp is an important consideration in making the time relative view meaningful.

{title}

[Time View Mode]

TraceX also provides a single summary line that includes all events on the same line. The summary line contains a summary of the context as well as the corresponding event summary underneath. This makes it easy to see an overview of a complex system. The summary bar is especially beneficial in systems that have a great number of threads. Without such a summary line, the user would have to follow complex system interactions using the vertical scroll bar to follow the context of execution.

System Summary Line

TraceX lists the system contexts on the left-hand side of the display. Events that occur in a particular context are displayed on the horizontal line to the right of that context. In this way, the user can easily ascertain which context the event occurred as well as follow that context line to see all the events that occurred in a particular context.

The first two context entries are always the “Interrupt” and “Initialize/Idle” contexts. The “Interrupt” context represents all system events made from Interrupt Service Routines (ISRs). The “Initialize/Idle” context represents two contexts in ThreadX. Events that occur during tx_application_define, are “Initialize” events and are displayed on the “Initialize/Idle” context. If the system is idle and thus no events are occurring, the green bar representing “Running” in the time view is drawn on the “Initialize/Idle” context.

{title}

System Summary Line

System Contexts

Methods of Navigation

{title}

TraceX enables the developer to specify how the “Next” and “Previous” navigation buttons operate.

{title}

If “Event” is selected, navigation is done on the next/previous event. If “Context” is selected, navigation is done on the next/previous event on the same context. If “Object” is selected, navigation is done on the next/previous event of the current object, e.g., events associated with a specific queue. If “Switches” is selected, navigation is done on the next/previous context switch. If “Same ID” is selected, navigation is done on the next/previous event for the same event ID.

Event Information Display

TraceX provides detailed information on some 300 events. These include 6 internal ThreadX events, 2 ISR events (enter and exit), 14 internal FileX events, 42 internal NetX events, and one user-defined event. The remaining events correspond directly to ThreadX, FileX, and NetX API services.

Regardless of whether sequential or time display mode is selected, a mouse-over on any event in the display area results in detailed event information displayed near the event. The mouse-over of event 494 in the demonstration demo_threadx.trx trace file is shown here:

{title}

Mouse-Over Displays More Info

Each event displayed contains standard information about Context and both the Relative Time and Time Stamp. The Context field shows what context the event took place in. There are exactly four contexts: thread, idle, ISR, and initialization. When an event takes place in a thread context, the thread name and its priority at that time is gathered and displayed as shown above. The Relative Time shows the relative number of timer ticks from the beginning of the trace. The Raw Time Stamp displays the raw time source of the event. Finally, all event-specific information is displayed. This information is detailed throughout the remainder of this chapter.

Zooming In and Out

By default, TraceX displays the events in an easy-to-view size, with a 1:1 pixel:tick mapping. The user may zoom in or zoom out as desired. Zooming out to 100% is useful to see the entire trace in the current display view, while zooming in is useful in conditions where the events overlap due to the resolution of the time stamp source.

{title}

Zoom-Out To 100% View or Zoom In for Details

When zoomed out at 100% – showing the entire trace within the current display page – it is easy to see all the context execution captured in the trace as well as the general events occurring within those contexts. Notice that “thread 1” and “thread 2” execute most often. The blue coloring for their events also suggests that these threads are making queue service calls (queue events are blue in color). To examine individual events, you can Zoom-In to a level of “magnification” that expands the display to show an area of interest in greater detail, as shown below.

{title}

Delta Ticks Between Events

Determining the number of ticks between various events in TraceX is easy—simply click on the starting event and drag the mouse to the ending event. The delta number of ticks between the events will show up in the upper right-hand corner of the display.

{title}

Delta Ticks

The delta ticks show that 501 ticks have elapsed between event 494 and event 496. This could also be calculated manually by looking at the relative time stamps in each event and subtracting, but using the GUI is easy and instantaneous.

Priority Inversions

TraceX automatically displays priority inversions detected in the trace file. Priority inversions are defined as conditions where a higher-priority thread is blocked trying to obtain a mutex that is currently owned by a lower-priority thread. This condition is termed “deterministic,” since the system was setup to operate in this manner. In order to inform the user, TraceX shows “deterministic” priority inversion ranges as a light salmon color.

TraceX also displays “un-deterministic” priority inversions. These priority inversions differ from the “deterministic” priority inversions in that another thread of a different priority level has executed in the middle of what was a “deterministic” priority inversion, thereby making the time within the priority inversion somewhat “un-deterministic.” This condition is often unknown to the user and can be very serious. In order to alert the user of this condition, TraceX shows “un-deterministic” priority inversions as a brighter salmon color.

{title}

Deterministic and Non-Deterministic Priority Inversion

TraceX Performance Analysis

Multi-Core CPU Utilization

{title}

TraceX Multi-Core provides a built-in CPU utilization report for all cores in the currently loaded trace file.

{title}

Execution Profile

{title}

TraceX provides a built-in execution profile report for all execution contexts within in the currently loaded trace file.

{title}

Performance Statistics

{title}

TraceX provides a built-in performance statistics report for the currently loaded trace file.

{title}
{title}

Thread Stack Usage

{title}

TraceX provides a built-in stack usage report for all threads executing within in the currently loaded trace file.

{title}

FileX Statistics

TraceX presents the FileX performance statistics of the currently loaded trace file. This information is displayed for the entire system—on all opened media objects.

{title}

NetX Statistics

TraceX also presents the NetX performance statistics of the currently loaded trace file. This information is displayed for the entire system.

{title}

Raw Trace Dump

TraceX can build a raw trace file in text format and launch notepad to display it.

{title}

Licensing Overview

TraceX is available from Express Logic at a price of $1,000 per developer (3 developer minimum) for a perpetual license. Like all Express Logic tool products, there are no license keys.

ThreadX Trace Events

The following is a list of ThreadX events displayed by TraceX:

Icon Meaning
Internal thread resume
Internal thread suspend
Interrupt Service Routine (ISR) Enter
Interrupt Service Routine (ISR) Exit
Internal time-slice
Running
User-Defined Event (See Chapter 4)
Block pool allocate (tx_block_allocate)
Block pool create (tx_block_pool_create)
Block pool delete (tx_block_pool_delete)
Block pool information get (tx_block_pool_info_get)
Block pool performance information get (tx_block_pool_performance_info_get)
Block pool system performance information get(tx_block_pool_performance_system_info_get)
Block pool prioritize (tx_block_pool_prioritize)
Block release to pool (tx_block_release)
Byte pool allocate memory (tx_byte_allocate)
Byte pool create (tx_byte_pool_create)
Byte pool delete (tx_byte_pool_delete)
Byte pool information get (tx_byte_pool_info_get)
Byte pool performance information get (tx_byte_pool_performance_info_get)
Byte pool system performance information get(tx_byte_pool_performance_system_info_get)
Byte pool prioritize (tx_byte_pool_prioritize)
Byte memory release to pool (tx_byte_release)
Event flags create (tx_event_flags_create)
Event flags delete (tx_event_flags_delete)
Event flags get (tx_event_flags_get)
Event flags information get (tx_event_flags_info_get)
Event flags performance information get (tx_event_flags_performance_info_get)
Event flags system performance information get(tx_event_flags_performance_system_info_get)
Event flags set (tx_event_flags_set)
Event flags set notify (tx_event_flags_set_notify)
Interrupt enable/disable (tx_interrupt_control)
Mutex create (tx_mutex_create)
Mutex delete (tx_mutex_delete)
Mutex get (tx_mutex_get)
Mutex information get (tx_mutex_info_get)
Mutex performance information get (tx_mutex_performance_info_get)
Mutex system performance information get (tx_mutex_performance_system_info_get)
Mutex prioritize (tx_mutex_prioritize)
Mutex put (tx_mutex_put)
Queue create (tx_queue_create)
Queue delete (tx_queue_delete)
Queue flush (tx_queue_flush)
Queue front send (tx_queue_front_send)
Queue information get (tx_queue_info_get)
Queue performance information get (tx_queue_performance_info_get)
Queue system performance information get (tx_queue_performance_system_info_get)
Queue prioritize (tx_queue_prioritize)
Queue receive message (tx_queue_receive)
Queue send message (tx_queue_send)
Queue send notify (tx_queue_send_notify)
Semaphore ceiling put (tx_semaphore_ceiling_put)
Semaphore create (tx_semaphore_create)
Semaphore delete (tx_semaphore_delete)
Semaphore get (tx_semaphore_get)
Semaphore information get (tx_semaphore_info_get)
Semaphore performance information get (tx_semaphroe_performance_info_get)
Semaphore system performance information get(tx_semaphore_performance_system_info_get)
Semaphore prioritize (tx_semaphore_prioritize)
Semaphore put (tx_semaphore_put)
Semaphore put notify (tx_semaphore_put_notify)
Thread create (tx_thread_create)
Thread delete (tx_thread_delete)
Thread exit/entry notify (tx_thread_entry_exit_notify)
Thread identify (tx_thread_identify)
Thread information get (tx_thread_info_get)
Thread performance information get (tx_thread_performance_info_get)
Thread performance system information get (tx_thread_performance_system_info_get)
Thread preemption change (tx_thread_preemption_change)
Thread priority change (tx_thread_priority_change)
Thread relinquish (tx_thread_relinquish)
Thread reset (tx_thread_reset)
Thread resume (tx_thread_resume)
Thread Sleep (tx_thread_sleep)
Thread stack error notify (tx_thread_stack_error_notify)
Thread suspend (tx_thread_suspend)
Thread terminate (tx_thread_terminate)
Thread time-slice change (tx_thread_time_slice_change)
Thread wait abort (tx_thread_wait_abort)
Time get (tx_time_get)
Time set (tx_time_set)
Timer activate (tx_timer_activate)
Timer change (tx_timer_change)
Timer create (tx_timer_create)
Timer deactivate (tx_timer_deactivate)
Timer delete (tx_timer_delete)
Timer information get (tx_timer_info_get)
Timer performance information get (tx_timer_performance_info_get)
Timer performance system information get (tx_timer_performance_system_info_get)

 

FileX Trace Events

The following is a list of FileX events displayed by TraceX:

Icon Meaning
Internal Logical Sector Cache Miss
Internal Directory Cache Miss
Internal Media Flush
Internal Directory Entry Read
Internal Directory Entry Write
Internal I/O Driver Read
Internal I/O Driver Write
Internal I/O Driver Flush
Internal I/O Driver Abort
Internal I/O Driver Initialize
Internal I/O Driver Boot Read
Internal I/O Driver Release Sectors
Internal I/O Driver Boot Write
Internal I/O Driver Driver Un-initialize
Directory Attributes Read (fx_directory_attributes_read)
Directory Attributes Set (fx_directory_attributes_set)
Directory Create (fx_directory_create)
Directory Default Get (fx_directory_default_get)
Directory Default Set (fx_directory_default_set)
Directory Delete (fx_directory_delete)
Directory First Entry Find (fx_directory_first_entry_find)
Directory First Full Entry Find (fx_directory_first_full_entry_find)
Directory Information Get (fx_directory_information_get)
Directory Local Path Clear (fx_directory_local_path_clear)
Directory Local Path Get (fx_directory_local_path_get)
Directory Local Path Restore (fx_directory_local_path_restore)
Directory Local Path Set (fx_directory_local_path_set)
Directory Long Name Get (fx_directory_long_name_get)
Directory Name Test (fx_directory_name_test)
Directory Next Entry Find (fx_directory_next_entry_find)
Directory Next Full Entry Find (fx_directory_next_full_entry_find)
Directory Rename (fx_directory_rename)
Directory Short Name Get (fx_directory_short_name_get)
File Allocate (fx_file_allocate)
File Attributes Read (fx_file_attributes_read)
File Attributes Set (fx_file_attributes_set)
File Best Effort Allocate (fx_file_best_effort_allocate)
File Close (fx_file_close)
File Create (fx_file_create)
File Date Time Set (fx_file_date_time_set)
File Delete (fx_file_delete)
File Open (fx_file_open)
File Read (fx_file_read)
File Relative Seek (fx_file_relative_seek)
File Rename (fx_file_rename)
File Seek (fx_file_seek)
File Truncate (fx_file_truncate)
File Truncate Release (fx_file_truncate_release)
File Write (fx_file_write)
Media Abort (fx_media_abort)
Media Cache Invalidate (fx_media_cache_invalidate)
Media Check (fx_media_check)
Media Close (fx_media_close)
Media Flush (fx_media_flush)
Media Format (fx_media_format)
Media Open (fx_media_open)
Media Read (fx_media_read)
Media Space Available (fx_media_space_available)
Media Volume Get (fx_media_volume_get)
Media Volume Set (fx_media_volume_set)
Media Write (fx_media_write)
System Date Get (fx_system_date_get)
System Date Set (fx_system_date_set)
System Initialize (fx_system_initialize)
System Time Get (fx_system_time_get)
System Time Set (fx_system_time_set)
Unicode Directory Create (fx_unicode_directory_create)
Unicode Directory Rename (fx_unicode_directory_rename)
Unicode File Create (fx_unicode_file_create)
Unicode File Rename (fx_unicode_file_rename)
Unicode Lenght Get (fx_unicode_length_get)
Unicode Name Get (fx_unicode_name_get)
Unicode Short Name Get (fx_unicode_short_name_get)

 

NetX Trace Events

The following is a list of NetX events displayed by TraceX:

Icon Meaning
Internal ARP Request Receive
Internal ARP Request Send
Internal ARP Response Receive
Internal ARP Response Send
Internal ICMP Receive
Internal ICMP Send
Internal IP Receive
Internal IP Send
Internal TCP Data Receive
Internal TCP Data Send
Internal TCP FIN Receive
Internal TCP FIN Send
Internal TCP RST Receive
Internal TCP RST Send
Internal TCP SYN Receive
Internal TCP SYN Send
Internal UDP Receive
Internal UDP Send
Internal RARP Receive
Internal RARP Send
Internal TCP Retry
Internal TCP State Change
Internal I/O Driver Packet Send
Internal I/O Driver Initialize
Internal I/O Driver Link Enable
Internal I/O Driver Link Disable
Internal I/O Driver Packet Broadcast
Internal I/O Driver ARP Send
Internal I/O Driver ARP Response Send
Internal I/O Driver RARP Send
Internal I/O Driver Multicast Join
Internal I/O Driver Multicast Leave
Internal I/O Driver Get Status
Internal I/O Driver Get Speed
Internal I/O Driver Get Duplex Type
Internal I/O Driver Get Error Count
Internal I/O Driver Get RX Count
Internal I/O Driver Get TX Count
Internal I/O Driver Get Allocation Errors
Internal I/O Driver Un-initialize
Internal I/O Driver Deferred Processing
ARP Dynamic Entries Invalidate (nx_arp_dynamic_entries_invalidate)
ARP Dynamic Entry Set (nx_arp_dynamic_entry_set)
ARP Enable (nx_arp_enable)
ARP Gratuitous Send (nx_arp_gratuitous_send)
ARP Hardware Address Find (nx_arp_hardware_address_find)
ARP Information Get (nx_arp_info_get)
ARP IP Address Find (nx_arp_ip_address_find)
ARP Static Entries Delete (nx_arp_static_entries_delete)
ARP Static Entry Create (nx_arp_static_entry_create)
ARP Static Entry Delete (nx_arp_static_entry_delete)
ICMP Enable (nx_icmp_enable)
ICMP Information Get (nx_icmp_info_get)
ICMP Ping (nx_icmp_ping)
IGMP Enable (nx_igmp_enable)
IGMP Information Get (nx_igmp_info_get)
IGMP Loopback Disable (nx_igmp_loopback_disable)
IGMP Loopback Enable (nx_igmp_loopback_enable)
IGMP Multicast Join (nx_igmp_multicast_join)
IGMP Multicast Leave (nx_igmp_multicast_leave)
IP Address Change Notify (nx_ip_address_change_notify)
IP Address Get (nx_ip_address_get)
IP Address Set (nx_ip_address_set)
IP Create (nx_ip_create)
IP Delete (nx_ip_delete)
IP Driver Direct Command (nx_ip_driver_direct_command)
IP Forwarding Disable (nx_ip_forwarding_disable)
IP Forwarding Enable (nx_ip_forwarding_enable)
IP Fragment Disable (nx_ip_fragment_disable)
IP Fragment Enable (nx_ip_fragment_enable)
IP Gateway Address Set (nx_ip_gateway_address_set)
IP Information Get (nx_ip_info_get)
IP Raw Packet Disable (nx_ip_raw_packet_disable)
IP Raw Packet Enable (nx_ip_raw_packet_enable)
IP Raw Packet Receive (nx_ip_raw_packet_receive)
IP Raw Packet Send (nx_ip_raw_packet_send)
IP Status Check (nx_ip_status_check)
Packet Allocate (nx_packet_allocate)
Packet Copy (nx_packet_copy)
Packet Data Append (nx_packet_data_append)
Packet Data Retrieve (nx_packet_data_retrieve)
Packet Length Get (nx_packet_length_get)
Packet Pool Create (nx_packet_pool_create)
Packet Pool Delete (nx_packet_pool_delete)
Packet Pool Information Get (nx_packet_pool_info_get)
Packet Release (nx_packet_release)
Packet Transmit Release (nx_packet_transmit_release)
RARP Disable (nx_rarp_disable)
RARP Enable (nx_rarp_enable)
RARP Information Get (nx_rarp_info_get)
System Initialize (nx_system_initialize)
TCP Client Socket Bind (nx_tcp_client_socket_bind)
TCP Client Socket Connect (nx_tcp_client_socket_connect)
TCP Client Socket Port Get (nx_tcp_client_socket_port_get)
TCP Client Socket Unbind (nx_tcp_client_socket_unbind)
TCP Enable (nx_tcp_enable)
TCP Free Port Find (nx_tcp_free_port_find)
TCP Information Get (nx_tcp_info_get)
TCP Server Socket Accept (nx_tcp_server_socket_accept)
TCP Server Socket Listen (nx_tcp_server_socket_listen)
TCP Server Socket Relisten (nx_tcp_server_socket_relisten)
TCP Server Socket Unaccept (nx_tcp_server_socket_unaccept)
TCP Server Socket Unlisten (nx_tcp_server_socket_unlisten)
TCP Socket Create (nx_tcp_socket_create)
TCP Socket Delete (nx_tcp_socket_delete)
TCP Socket Disconnect (nx_tcp_socket_disconnect)
TCP Socket Information Get (nx_tcp_socket_info_get)
TCP Socket MSS Get (nx_tcp_socket_mss_get)
TCP Socket MSS Peer Get (nx_tcp_socket_mss_peer_get)
TCP Socket MSS Set (nx_tcp_socket_mss_set)
TCP Socket Receive (nx_tcp_socket_receive)
TCP Socket Receive Notify (nx_tcp_socket_receive_notify)
TCP Socket Send (nx_tcp_socket_send)
TCP Socket State Wait (nx_tcp_socket_state_wait)
TCP Socket Transmit Configure (nx_tcp_socket_transmit_configure)
UDP Enable (nx_udp_enable)
UDP Free Port Find (nx_udp_free_port_find)
UDP Information Get (nx_udp_info_get)
UDP Socket Bind (nx_udp_socket_bind)
UDP Socket Checksum Disable (nx_udp_socket_checksum_disable)
UDP Socket Checksum Enable (nx_udp_socket_checksum_enable)
UDP Socket Create (nx_udp_socket_create)
UDP Socket Delete (nx_udp_socket_delete)
UDP Socket Information Get (nx_udp_socket_info_get)
UDP Socket Port Get (nx_udp_socket_port_get)
UDP Socket Receive (nx_udp_socket_receive)
UDP Socket Receive Notify (nx_udp_socket_receive_notify)
UDP Socket Send (nx_udp_socket_send)
UDP Socket Unbind (nx_udp_socket_unbind)
UDP Source Extract (nx_udp_source_extract)