QSPY provides a simple consolidated, human-readable textual output to the screen. The readability of this output depends strongly on the availability of the symbolic information about the various objects in the Target code, called dictionaries. If the "dictionaries" are not available, QSPY can output only the hexadecimal values of various object addresses and event signals. However, if QSPY has acquired the dictionaries from the Target, or has read them from a file, it can apply the symbolic information to output the provided identifiers for objects, signals, and states.
*, [, ], ?, !
. This is because the QUTest scripts use regular expressions to match QSPY textuall output with the expected output.For example, the following listing shows the QSPY text output when the dictionaries are available:
QSPY 6.9.0 Copyright (c) 2005-2020 Quantum Leaps Documentation: https://www.state-machine.com/qtools/qspy.html Current timestamp: 200827_093625 -c COM7 -u 7701 -v 660 -T 4 -O 4 -F 4 -S 2 -E 2 -Q 1 -P 2 -B 2 -C 2 ########## Trg-RST QP-Ver=690,Build=200824_123230 Obj-Dict 0x20001048->QS_RX Obj-Dict 0x08004009->l_SysTick_Handler Usr-Dict 00000100->PHILO_STAT Obj-Dict 0x20000EE0->AO_Table Obj-Dict 0x20000DDC->AO_Philo[0] Obj-Dict 0x20000E10->AO_Philo[1] . . . . . Obj-Dict 0x20000F94->EvtPool1 Obj-Dict 0x20000DDC->Philo_inst[0] Obj-Dict 0x20000E00->Philo_inst[0].timeEvt Obj-Dict 0x20000E10->Philo_inst[1] Obj-Dict 0x20000E34->Philo_inst[1].timeEvt Obj-Dict 0x20000E44->Philo_inst[2] . . . . . Fun-Dict 0x080006A9->Philo_initial Fun-Dict 0x08000915->Philo_thinking Fun-Dict 0x08000871->Philo_hungry Fun-Dict 0x080007C5->Philo_eating Sig-Dict 00000010,Obj=0x20000DDC->HUNGRY_SIG Sig-Dict 00000011,Obj=0x20000DDC->TIMEOUT_SIG 0000000000 AO-Subsc Obj=Philo_inst[0],Sig=00000004,Obj=0x20000DDC 0000000000 AO-Subsc Obj=Philo_inst[0],Sig=00000008,Obj=0x20000DDC ===RTC===> St-Init Obj=Philo_inst[0],State=0x08001099->Philo_thinking 0000000000 TE0-Arm Obj=Philo_inst[0].timeEvt,AO=Philo_inst[0],Tim=84,Int=0 ===RTC===> St-Entry Obj=Philo_inst[0],State=Philo_thinking 0000000000 Init===> Obj=Philo_inst[0],State=Philo_thinking Sig-Dict 00000010,Obj=0x20000E10->HUNGRY_SIG Sig-Dict 00000011,Obj=0x20000E10->TIMEOUT_SIG . . . . . . . . . . ===RTC===> St-Init Obj=Table_inst,State=0x08001099->Table_serving ===RTC===> St-Entry Obj=Table_inst,State=Table_serving 0000000000 Init===> Obj=Table_inst,State=Table_serving QF_RUN 4294946722 QF-Pub Sdr=l_SysTick_Handler,Evt<Sig=SERVE_SIG,Pool=0,Ref=0> 4294947277 AO-Post Sdr=l_SysTick_Handler,Obj=Table_inst,Evt<Sig=SERVE_SIG,Pool=0,Ref=0>,Que<Free=5,Min=5> 4294948158 Sch-Next Pri=0->6 4294948490 AO-GetL Obj=Table_inst,Evt<Sig=SERVE_SIG,Pool=0,Ref=0> 4294949010 Disp===> Obj=Table_inst,Sig=SERVE_SIG,State=Table_serving 4294949660 =>Ignore Obj=Table_inst,Sig=SERVE_SIG,State=Table_serving 4294950254 Sch-Idle Pri=6->0 TE0-ADis Obj=Philo_inst[4].timeEvt,AO=Philo_inst[4] 4294946907 TE0-Post Obj=Philo_inst[4].timeEvt,Sig=TIMEOUT_SIG,AO=Philo_inst[4] 4294947535 AO-Post Sdr=l_SysTick_Handler,Obj=Philo_inst[4],Evt<Sig=TIMEOUT_SIG,Pool=0,Ref=0>,Que<Free=5,Min=5> 4294948568 Sch-Next Pri=0->5 4294948900 AO-GetL Obj=Philo_inst[4],Evt<Sig=TIMEOUT_SIG,Pool=0,Ref=0> 4294949419 Disp===> Obj=Philo_inst[4],Sig=TIMEOUT_SIG,State=Philo_thinking 4294950135 TE0-DisA Obj=Philo_inst[4].timeEvt,AO=Philo_inst[4] ===RTC===> St-Exit Obj=Philo_inst[4],State=Philo_thinking 4294951090 QF-New Sig=HUNGRY_SIG,Size=6 4294951506 MP-Get Obj=EvtPool1,Free=9,Min=9 4294952081 AO-Post Sdr=Philo_inst[4],Obj=Table_inst,Evt<Sig=HUNGRY_SIG,Pool=1,Ref=1>,Que<Free=5,Min=5> 4294952841 Sch-Next Pri=5->6 4294953173 AO-GetL Obj=Table_inst,Evt<Sig=HUNGRY_SIG,Pool=1,Ref=1> 4294953692 Disp===> Obj=Table_inst,Sig=HUNGRY_SIG,State=Table_serving 4294954299 PHILO_STAT 4 hungry 4294954817 QF-New Sig=EAT_SIG,Size=6 4294955233 MP-Get Obj=EvtPool1,Free=8,Min=8 4294955759 QF-Pub Sdr=Table_inst,Evt<Sig=EAT_SIG,Pool=1,Ref=0> 4294956277 Sch-Lock Ceil=0->5 4294956667 AO-Post Sdr=Table_inst,Obj=Philo_inst[4],Evt<Sig=EAT_SIG,Pool=1,Ref=2>,Que<Free=5,Min=5> 4294957464 AO-Post Sdr=Table_inst,Obj=Philo_inst[3],Evt<Sig=EAT_SIG,Pool=1,Ref=3>,Que<Free=5,Min=5> 4294958261 AO-Post Sdr=Table_inst,Obj=Philo_inst[2],Evt<Sig=EAT_SIG,Pool=1,Ref=4>,Que<Free=5,Min=5> 4294959058 AO-Post Sdr=Table_inst,Obj=Philo_inst[1],Evt<Sig=EAT_SIG,Pool=1,Ref=5>,Que<Free=5,Min=5> 4294959855 AO-Post Sdr=Table_inst,Obj=Philo_inst[0],Evt<Sig=EAT_SIG,Pool=1,Ref=6>,Que<Free=5,Min=5> 4294960624 Sch-Unlk Ceil=5->0 . . . . . .
The QS trace log shown in the listing above contains quite detailed information, because most QS records are enabled (are not blocked in the QS filters). The following bullet items highlight the most interesting parts of the trace and illustrate how you can interpret the trace data:
===RTC===> St-Init
record indicates that the top-most initial transition in the active object l_table
has been taken. After this, the ===RTC===> St-Entry
record informs you that the state Table_serving
has been entered, and finally the record ==>Init
tells you that the top-most initial transition sequence has completed. This trace record has a high-resolution time-stamp (the first 10-digit number) generated by the Target. The time units used by this time-stamp depend on the specific hardware timer used in the Target, but typically it is sub-microsecond.0000380805
an event was dispatched (Disp===>
record) to l_table
, but it was subsequently Ignored
, while l_table
was in the state Table_serving
.The following table summarizes the text output format used for all predefined QS trace records (see QSpyRecords).
*, [, ], ?, !
. This is because the QUTest scripts use regular expressions to match QSPY textuall output with the expected output.State Machine Trace Records (QEP) | |||
Rec. Num. | Rec. Enum. | Start of record | Comment |
1 | QS_QEP_STATE_ENTRY | ===RTC===> St-Entry | a state was entered |
2 | QS_QEP_STATE_EXIT | ===RTC===> St-Exit | a state was exited |
3 | QS_QEP_STATE_INIT | <timestamp> St-Init | an initial transition was taken in a state |
4 | QS_QEP_INIT_TRAN | <timestamp> Init===> | the top-most initial transition was taken |
5 | QS_QEP_INTERN_TRAN | <timestamp> =>Intern | an internal transition was taken |
6 | QS_QEP_TRAN | <timestamp> ===>Tran | a regular transition was taken |
7 | QS_QEP_IGNORED | <timestamp> =>Ignore | an event was ignored (silently discarded) |
8 | QS_QEP_DISPATCH | <timestamp> Disp===> | an event was dispatched (begin of RTC step) |
9 | QS_QEP_UNHANDLED | ===RTC===> St-Unhnd | a guard prevented handling of an event |
55 | QS_QEP_TRAN_HIST | ===RTC===> St-Hist | an a transition to history was taken |
56 | QS_QEP_TRAN_EP | ===RTC===> St-EP | an a transition to entry point into a submachine |
57 | QS_QEP_TRAN_XP | ===RTC===> St-XP | an a transition to exit point out of a submachine |
Active Object Trace Records | |||
Rec. Num. | Rec. Enum. | Start of record | Comment |
12 | QS_QF_ACTIVE_SUBSCRIBE | <timestamp> AO-Subsc | an AO subscribed to an event |
13 | QS_QF_ACTIVE_UNSUBSCRIBE | <timestamp> AO-Unsub | an AO unsubscribed to an event |
14 | QS_QF_ACTIVE_POST | <timestamp> AO-Post | an event was posted (FIFO) directly to AO |
15 | QS_QF_ACTIVE_POST_LIFO | <timestamp> AO-LIFO | an event was posted (LIFO) directly to AO |
16 | QS_QF_ACTIVE_GET | <timestamp> AO-Get | AO got an event and its queue is still not empty |
17 | QS_QF_ACTIVE_GET_LAST | <timestamp> AO-GetL | AO got an event and its queue is empty |
45 | QS_QF_ACTIVE_POST_ATTEMPT | <timestamp> AO-PostA | attempt to post an evt to AO failed |
Raw Event Queue Trace Records | |||
Rec. Num. | Rec. Enum. | Start of record | Comment |
19 | QS_QF_EQUEUE_POST | <timestamp> EQ-Post | an event was posted (FIFO) to a raw queue |
20 | QS_QF_EQUEUE_POST_LIFO | <timestamp> EQ-LIFO | an event was posted (LIFO) to a raw queue |
21 | QS_QF_EQUEUE_GET | <timestamp> EQ-Get | get an event and queue still not empty |
22 | QS_QF_EQUEUE_GET_LAST | <timestamp> EQ-GetL | get the last event from the queue |
46 | QS_QF_EQUEUE_POST_ATTEMPT | <timestamp> EQ-PostA | attempt to post an evt to QEQueue failed |
Raw Memory Pool Trace Records | |||
Rec. Num. | Rec. Enum. | Start of record | Comment |
24 | QS_QF_MPOOL_GET | <timestamp> MP-Get | a memory block was removed from a memory pool |
24 | QS_QF_MPOOL_GET_ATTEMPT | <timestamp> MP-GetA | a memory block was removed from a memory pool |
25 | QS_QF_MPOOL_PUT | <timestamp> MP-Put | a memory block was returned to a memory pool |
47 | QS_QF_MPOOL_GET_ATTEMPT | <timestamp> MP-GetA | attempt to get a memory block failed |
Event Management (QF) | |||
Rec. Num. | Rec. Enum. | Start of record | Comment |
26 | QS_QF_PUBLISH | <timestamp> QF-Pub | an event was published |
27 | RESERVED | ||
28 | QS_QF_NEW | <timestamp> QF-New | new event creation |
29 | QS_QF_GC_ATTEMPT | <timestamp> QF-gcA | garbage collection attempt |
30 | QS_QF_GC | <timestamp> QF-gc | garbage collection performed |
31 | QS_QF_TICK | Tick | QF system clock tick processing was called |
39 | QS_QF_CRIT_ENTRY | <timestamp> QF-CritE | critical section was entered |
40 | QS_QF_CRIT_EXIT | <timestamp> QF-CritX | critical section was exited |
41 | QS_QF_ISR_ENTRY | <timestamp> QF-IsrE | an ISR was entered |
42 | QS_QF_ISR_EXIT | <timestamp> QF-IsrX | an ISR was exited |
Time Events (TE) | |||
Rec. Num. | Rec. Enum. | Start of record | Comment |
32 | QS_QF_TIMEEVT_ARM | <timestamp> TE-Arm | a time event was armed |
33 | QS_QF_TIMEEVT_AUTO_DISARM | <timestamp> TE-ADis | a time event expired and was disarmed |
34 | QS_QF_TIMEEVT_DISARM_ATTEMPT | <timestamp> TE-DisA | attempt to disarmed a disarmed tevent |
35 | QS_QF_TIMEEVT_DISARM | <timestamp> TE-Dis | true disarming of an armed time event |
36 | QS_QF_TIMEEVT_REARM | <timestamp> TE-Rarm | rearming of a time event |
37 | QS_QF_TIMEEVT_POST | <timestamp> TE-Post | a time event posted itself directly to an AO |
38 | #QS_QF_TIMEEVT_CTR | <timestamp> TE-Ctr | a time event counter was requested |
Scheduler Trace Records | |||
Rec. Num. | Rec. Enum. | Start of record | Comment |
50 | QS_SCHED_LOCK | <timestamp> Sch-Lock | scheduler was locked |
51 | QS_SCHED_UNLOCK | <timestamp> Sch-Unlk | scheduler was unlocked |
52 | QS_SCHED_NEXT | <timestamp> Sch-Next | scheduler found next task to execute |
53 | QS_SCHED_IDLE | <timestamp> Sch-Idle | scheduler became idle |
54 | QS_SCHED_RESUME | <timestamp> Sch-Rsme | scheduler resumed previous task (not idle) |
Miscellaneous Trace Records | |||
Rec. Num. | Rec. Enum. | Start of record | Comment |
58 | QS_TEST_PAUSED | TstPause | test has been paused |
59 | QS_TEST_PROBE_GET | <timestamp> TstProbe | reports that Test-Probe has been used |
60 | QS_SIG_DICTIONARY | Sig-Dict | signal dictionary entry |
61 | QS_OBJ_DICTIONARY | Obj-Dict | object dictionary entry |
62 | QS_FUN_DICTIONARY | Fun-Dict | function dictionary entry |
63 | QS_USR_DICTIONARY | Usr-Dict | User record dictionary entry |
64 | QS_TARGET_INFO | ########## Trg-Info | reports the Target information |
65 | QS_TARGET_DONE | <timestamp> Trg-Done | reports completion of a user callback |
66 | QS_RX_STATUS | Trg-Ack | reports QS data receive status |
66 | RESERVED | ||
66 | QS_PEEK_DATA | Trg-Peek | reports the data from the PEEK query |
67 | QS_ASSERT_FAIL | <timestamp> =ASSERT= | Assertion fired |
User (Application Specific) Records | |||
100 | QS_USER + xxx | <timestamp> USER+xxx | application-specific (user) QS records (100..124) |
Next: QSPY Dictionaries