@@ -319,7 +319,7 @@ public override void ForEach(Func<EventRecord, bool> callback)
319
319
}
320
320
}
321
321
}
322
-
322
+
323
323
ETWEventRecord eventRecord = null ;
324
324
if ( textFilter != null )
325
325
{
@@ -346,7 +346,8 @@ public override void ForEach(Func<EventRecord, bool> callback)
346
346
eventRecord = emptyEventRecord ;
347
347
eventRecord . m_timeStampRelativeMSec = data . TimeStampRelativeMSec ;
348
348
}
349
-
349
+
350
+
350
351
if ( eventRecord == null )
351
352
{
352
353
eventRecord = new ETWEventRecord ( this , data , columnOrder , NonRestFields , durationMSec ) ;
@@ -534,6 +535,7 @@ private Dictionary<TraceEventCounts, TraceEventCounts> GetEventCounts(List<strin
534
535
private Dictionary < string , bool > m_selectedEvents ; // set to true if the event is only present because it is a start for a stop.
535
536
private bool m_selectedAllEvents ; // This ensures that when a user selects all events he gets everything
536
537
538
+
537
539
internal class ETWEventRecord : EventRecord
538
540
{
539
541
// Used as the null record (after MaxRet happens).
@@ -552,29 +554,30 @@ internal ETWEventRecord(ETWEventSource source, TraceEvent data, Dictionary<strin
552
554
553
555
m_timeStampRelativeMSec = data . TimeStampRelativeMSec ;
554
556
m_idx = data . EventIndex ;
555
-
557
+ m_payloads = new List < Payload > ( ) ;
558
+
556
559
// Compute the data column
557
560
var restString = new StringBuilder ( ) ;
558
561
559
562
// Deal with the special HasStack, ThreadID and ActivityID, DataLength fields;
560
563
var hasStack = data . CallStackIndex ( ) != CallStackIndex . Invalid ;
561
564
if ( hasStack )
562
565
{
563
- AddField ( "HasStack" , hasStack . ToString ( ) , columnOrder , restString ) ;
566
+ AddField ( "HasStack" , hasStack . ToString ( ) , columnOrder , restString , m_payloads ) ;
564
567
}
565
568
566
569
var asCSwitch = data as CSwitchTraceData ;
567
570
if ( asCSwitch != null )
568
571
{
569
- AddField ( "HasBlockingStack" , ( asCSwitch . BlockingStack ( ) != CallStackIndex . Invalid ) . ToString ( ) , columnOrder , restString ) ;
572
+ AddField ( "HasBlockingStack" , ( asCSwitch . BlockingStack ( ) != CallStackIndex . Invalid ) . ToString ( ) , columnOrder , restString , m_payloads ) ;
570
573
}
571
574
572
- AddField ( "ThreadID" , data . ThreadID . ToString ( "n0" ) , columnOrder , restString ) ;
573
- AddField ( "ProcessorNumber" , data . ProcessorNumber . ToString ( ) , columnOrder , restString ) ;
575
+ AddField ( "ThreadID" , data . ThreadID . ToString ( "n0" ) , columnOrder , restString , m_payloads ) ;
576
+ AddField ( "ProcessorNumber" , data . ProcessorNumber . ToString ( ) , columnOrder , restString , m_payloads ) ;
574
577
575
578
if ( 0 < durationMSec )
576
579
{
577
- AddField ( "DURATION_MSEC" , durationMSec . ToString ( "n3" ) , columnOrder , restString ) ;
580
+ AddField ( "DURATION_MSEC" , durationMSec . ToString ( "n3" ) , columnOrder , restString , m_payloads ) ;
578
581
}
579
582
580
583
var payloadNames = data . PayloadNames ;
@@ -583,28 +586,28 @@ internal ETWEventRecord(ETWEventSource source, TraceEvent data, Dictionary<strin
583
586
// WPP events look classic and use the EventID as their discriminator
584
587
if ( data . IsClassicProvider && data . ID != 0 )
585
588
{
586
- AddField ( "EventID" , ( ( int ) data . ID ) . ToString ( ) , columnOrder , restString ) ;
589
+ AddField ( "EventID" , ( ( int ) data . ID ) . ToString ( ) , columnOrder , restString , m_payloads ) ;
587
590
}
588
591
589
- AddField ( "DataLength" , data . EventDataLength . ToString ( ) , columnOrder , restString ) ;
592
+ AddField ( "DataLength" , data . EventDataLength . ToString ( ) , columnOrder , restString , m_payloads ) ;
590
593
}
591
594
592
595
try
593
596
{
594
597
for ( int i = 0 ; i < payloadNames . Length ; i ++ )
595
598
{
596
- AddField ( payloadNames [ i ] , data . PayloadString ( i ) , columnOrder , restString ) ;
599
+ AddField ( payloadNames [ i ] , data . PayloadString ( i ) , columnOrder , restString , m_payloads ) ;
597
600
}
598
601
}
599
602
catch ( Exception e )
600
603
{
601
- AddField ( "ErrorParsingFields" , e . Message , columnOrder , restString ) ;
604
+ AddField ( "ErrorParsingFields" , e . Message , columnOrder , restString , m_payloads ) ;
602
605
}
603
606
604
607
var message = data . FormattedMessage ;
605
608
if ( message != null )
606
609
{
607
- AddField ( "FormattedMessage" , message , columnOrder , restString ) ;
610
+ AddField ( "FormattedMessage" , message , columnOrder , restString , m_payloads ) ;
608
611
}
609
612
610
613
if ( source . m_needsComputers )
@@ -621,7 +624,7 @@ internal ETWEventRecord(ETWEventSource source, TraceEvent data, Dictionary<strin
621
624
id = "^" + id ; // Indicates it is at the start of the task.
622
625
}
623
626
624
- AddField ( "ActivityInfo" , id , columnOrder , restString ) ;
627
+ AddField ( "ActivityInfo" , id , columnOrder , restString , m_payloads ) ;
625
628
}
626
629
627
630
var startStopActivity = source . m_startStopActivityComputer . GetCurrentStartStopActivity ( thread , data ) ;
@@ -634,26 +637,26 @@ internal ETWEventRecord(ETWEventSource source, TraceEvent data, Dictionary<strin
634
637
parentName = startStopActivity . Creator . Name ;
635
638
}
636
639
637
- AddField ( "StartStopActivity" , name + "/P=" + parentName , columnOrder , restString ) ;
640
+ AddField ( "StartStopActivity" , name + "/P=" + parentName , columnOrder , restString , m_payloads ) ;
638
641
}
639
642
}
640
643
}
641
644
642
645
// We pass 0 as the process ID for creating the activityID because we want uniform syntax.
643
646
if ( data . ActivityID != Guid . Empty )
644
647
{
645
- AddField ( "ActivityID" , StartStopActivityComputer . ActivityPathString ( data . ActivityID ) , columnOrder , restString ) ;
648
+ AddField ( "ActivityID" , StartStopActivityComputer . ActivityPathString ( data . ActivityID ) , columnOrder , restString , m_payloads ) ;
646
649
}
647
650
648
651
Guid relatedActivityID = data . RelatedActivityID ;
649
652
if ( relatedActivityID != Guid . Empty )
650
653
{
651
- AddField ( "RelatedActivityID" , StartStopActivityComputer . ActivityPathString ( data . RelatedActivityID ) , columnOrder , restString ) ;
654
+ AddField ( "RelatedActivityID" , StartStopActivityComputer . ActivityPathString ( data . RelatedActivityID ) , columnOrder , restString , m_payloads ) ;
652
655
}
653
656
654
657
if ( data . ContainerID != null )
655
658
{
656
- AddField ( "ContainerID" , data . ContainerID , columnOrder , restString ) ;
659
+ AddField ( "ContainerID" , data . ContainerID , columnOrder , restString , m_payloads ) ;
657
660
}
658
661
659
662
m_asText = restString . ToString ( ) ;
@@ -666,7 +669,8 @@ internal ETWEventRecord(ETWEventSource source, TraceEvent data, Dictionary<strin
666
669
public DateTime OriginTimeStamp { get { return TimeZoneInfo . ConvertTime ( LocalTimeStamp , this . m_source . OriginTimeZone ) ; } }
667
670
public override string Rest { get { return m_asText ; } set { } }
668
671
public EventIndex Index { get { return m_idx ; } }
669
-
672
+ public override List < Payload > Payloads { get { return m_payloads ; } }
673
+
670
674
#region private
671
675
672
676
private static readonly Regex specialCharRemover = new Regex ( " *[\r \n \t ]+ *" , RegexOptions . Compiled ) ;
@@ -675,12 +679,15 @@ internal ETWEventRecord(ETWEventSource source, TraceEvent data, Dictionary<strin
675
679
/// Adds 'fieldName' with value 'fieldValue' to the output. It either goes into a column (based on columnOrder) or it goes into
676
680
/// 'rest' as a fieldName="fieldValue" string. It also updates 'columnSums' for the fieldValue for any in a true column
677
681
/// </summary>
678
- private void AddField ( string fieldName , string fieldValue , Dictionary < string , int > columnOrder , StringBuilder restString )
682
+ private void AddField ( string fieldName , string fieldValue , Dictionary < string , int > columnOrder , StringBuilder restString , List < Payload > payloadsList )
679
683
{
680
684
if ( fieldValue == null )
681
685
{
682
686
fieldValue = "" ;
683
687
}
688
+
689
+ payloadsList . Add ( new Payload ( fieldName , fieldValue ) ) ;
690
+
684
691
// If the field value has to many newlines in it, the GUI gets confused because the text block is larger than
685
692
// the vertical size. WPF may fix this at some point, but in the mean time this is a work around.
686
693
fieldValue = specialCharRemover . Replace ( fieldValue , " " ) ;
@@ -787,6 +794,7 @@ public override bool Matches(Regex textRegex)
787
794
private string m_asText ;
788
795
private EventIndex m_idx ;
789
796
private ETWEventSource m_source ; // Lets you get at source information
797
+ private List < Payload > m_payloads ;
790
798
#endregion
791
799
}
792
800
0 commit comments