@@ -60,8 +60,8 @@ HRESULT NonGcHeapProfiler::GarbageCollectionFinished()
60
60
61
61
_garbageCollections++;
62
62
63
- std::vector<ULONG > segment_starts;
64
- std::vector<ULONG > segment_ends;
63
+ std::vector<uint64_t > segment_starts;
64
+ std::vector<uint64_t > segment_ends;
65
65
const int MAX_SEGMENTS = 16 ;
66
66
COR_PRF_NONGC_HEAP_RANGE nongc_segments[MAX_SEGMENTS];
67
67
COR_PRF_GC_GENERATION_RANGE gc_segments[MAX_SEGMENTS];
@@ -70,94 +70,101 @@ HRESULT NonGcHeapProfiler::GarbageCollectionFinished()
70
70
HRESULT hr = pCorProfilerInfo->GetNonGCHeapBounds (MAX_SEGMENTS, &segCount, nongc_segments);
71
71
if (FAILED (hr))
72
72
{
73
- printf (" GetNonGCHeapBounds returned an error\n !" );
73
+ printf (" FAIL: GetNonGCHeapBounds returned an error\n !" );
74
74
_failures++;
75
75
}
76
76
else if (segCount == 0 || segCount > MAX_SEGMENTS)
77
77
{
78
- printf (" GetNonGCHeapBounds: invalid segCount (%u)\n !" , segCount);
78
+ printf (" FAIL: GetNonGCHeapBounds: invalid segCount (%u)\n !" , ( uint32_t ) segCount);
79
79
_failures++;
80
80
}
81
81
else
82
82
{
83
83
// Save very first object ID to compare with EnumerateNonGCObjects
84
84
firstObj = nongc_segments[0 ].rangeStart ;
85
85
86
- printf (" \n GetNonGCHeapBounds (segCount = %u):\n " , segCount);
87
- for (ULONG i = 0 ; i < segCount; i++)
86
+ printf (" \n GetNonGCHeapBounds (segCount = %u):\n " , ( uint32_t ) segCount);
87
+ for (uint32_t i = 0 ; i < ( uint32_t ) segCount; i++)
88
88
{
89
89
printf (" \t seg#%u, rangeStart=%p, rangeLength=%u, rangeLengthReserved=%u\n " ,
90
- i, (void *)nongc_segments[i].rangeStart , (ULONG )nongc_segments[i].rangeLength , (ULONG )nongc_segments[i].rangeLengthReserved );
90
+ i, (void *)nongc_segments[i].rangeStart , (uint32_t )nongc_segments[i].rangeLength , (uint32_t )nongc_segments[i].rangeLengthReserved );
91
91
92
- if ((ULONG) nongc_segments[i].rangeLength > (ULONG) nongc_segments[i].rangeLengthReserved )
92
+ if (nongc_segments[i].rangeLength > nongc_segments[i].rangeLengthReserved )
93
93
{
94
- printf (" GetNonGCHeapBounds: rangeLength > rangeLengthReserved" );
94
+ printf (" FAIL: GetNonGCHeapBounds: rangeLength > rangeLengthReserved" );
95
95
_failures++;
96
96
}
97
97
98
98
if (!nongc_segments[i].rangeStart )
99
99
{
100
- printf (" GetNonGCHeapBounds: rangeStart is null" );
100
+ printf (" FAIL: GetNonGCHeapBounds: rangeStart is null" );
101
101
_failures++;
102
102
}
103
- segment_starts.emplace_back ((ULONG) nongc_segments[i].rangeStart );
104
- segment_ends.emplace_back ((ULONG) nongc_segments[i].rangeStart + (ULONG) nongc_segments[i].rangeLengthReserved );
103
+ segment_starts.push_back ( nongc_segments[i].rangeStart );
104
+ segment_ends.push_back ( nongc_segments[i].rangeStart + nongc_segments[i].rangeLengthReserved );
105
105
}
106
106
printf (" \n " );
107
107
}
108
108
hr = pCorProfilerInfo->GetGenerationBounds (MAX_SEGMENTS, &segCount, gc_segments);
109
109
if (FAILED (hr))
110
110
{
111
- printf (" GetGenerationBounds returned an error\n !" );
111
+ printf (" FAIL: GetGenerationBounds returned an error\n !" );
112
112
_failures++;
113
113
}
114
114
else if (segCount == 0 || segCount > MAX_SEGMENTS)
115
115
{
116
- printf (" GetGenerationBounds: invalid segCount (%u)\n !" , segCount);
116
+ printf (" FAIL: GetGenerationBounds: invalid segCount (%u)\n !" , ( uint32_t ) segCount);
117
117
_failures++;
118
118
}
119
119
else
120
120
{
121
- printf (" \n GetGenerationBounds (segCount = %u):\n " , segCount);
122
- for (ULONG i = 0 ; i < segCount; i++)
121
+ printf (" \n GetGenerationBounds (segCount = %u):\n " , ( uint32_t ) segCount);
122
+ for (uint64_t i = 0 ; i < segCount; i++)
123
123
{
124
124
printf (" \t seg#%u, rangeStart=%p, rangeLength=%u, rangeLengthReserved=%u\n " ,
125
- i, (void *)gc_segments[i].rangeStart , (ULONG )gc_segments[i].rangeLength , (ULONG )gc_segments[i].rangeLengthReserved );
125
+ ( uint32_t ) i, (void *)gc_segments[i].rangeStart , (uint32_t )gc_segments[i].rangeLength , (uint32_t )gc_segments[i].rangeLengthReserved );
126
126
127
- if ((ULONG) gc_segments[i].rangeLength > (ULONG) gc_segments[i].rangeLengthReserved )
127
+ if (gc_segments[i].rangeLength > gc_segments[i].rangeLengthReserved )
128
128
{
129
- printf (" GetGenerationBounds: rangeLength > rangeLengthReserved" );
129
+ printf (" FAIL: GetGenerationBounds: rangeLength > rangeLengthReserved" );
130
130
_failures++;
131
131
}
132
132
133
133
if (!gc_segments[i].rangeStart )
134
134
{
135
- printf (" GetGenerationBounds: rangeStart is null" );
135
+ printf (" FAIL: GetGenerationBounds: rangeStart is null" );
136
136
_failures++;
137
137
}
138
- segment_starts.emplace_back ((ULONG) gc_segments[i].rangeStart );
139
- segment_ends.emplace_back ((ULONG) gc_segments[i].rangeStart + (ULONG) gc_segments[i].rangeLengthReserved );
138
+ segment_starts.push_back ( gc_segments[i].rangeStart );
139
+ segment_ends.push_back ( gc_segments[i].rangeStart + gc_segments[i].rangeLengthReserved );
140
140
}
141
141
printf (" \n " );
142
142
}
143
143
sort (segment_starts.begin (), segment_starts.end ());
144
144
sort (segment_ends.begin (), segment_ends.end ());
145
- for (size_t i = 0 ; i < segment_starts.size () - 1 ; i++)
145
+
146
+ // Do segments overlap?
147
+ if (segment_starts.size () > 1 )
146
148
{
147
- if (segment_starts[i] == segment_starts[i+ 1 ] )
149
+ for ( size_t i = 0 ; i < segment_starts. size () - 1 ; i++ )
148
150
{
149
- printf (" Duplicated segment starts" );
150
- _failures++;
151
- }
152
- if (segment_ends[i] == segment_ends[i+1 ])
153
- {
154
- printf (" Duplicated segment ends" );
155
- _failures++;
156
- }
157
- if (segment_ends[i] > segment_starts[i+1 ])
158
- {
159
- printf (" Overlapping segments\n " );
160
- _failures++;
151
+ printf (" inspecting segment %d [rangeStart=%p rangeEnd=%p]\n " , (int )i, (void *)segment_starts[i], (void *)segment_ends[i]);
152
+
153
+ if (segment_starts[i] == segment_starts[i+1 ])
154
+ {
155
+ printf (" FAIL: Duplicated segment starts" );
156
+ _failures++;
157
+ }
158
+ if (segment_ends[i] == segment_ends[i+1 ])
159
+ {
160
+ printf (" FAIL: Duplicated segment ends" );
161
+ _failures++;
162
+ }
163
+ if (segment_ends[i] > segment_starts[i+1 ])
164
+ {
165
+ printf (" FAIL: Overlapping segments\n " );
166
+ _failures++;
167
+ }
161
168
}
162
169
}
163
170
@@ -167,7 +174,7 @@ HRESULT NonGcHeapProfiler::GarbageCollectionFinished()
167
174
hr = pCorProfilerInfo->EnumerateNonGCObjects (&pEnum);
168
175
if (FAILED (hr))
169
176
{
170
- printf (" EnumerateNonGCObjects returned an error\n !" );
177
+ printf (" FAIL: EnumerateNonGCObjects returned an error\n !" );
171
178
_failures++;
172
179
}
173
180
else
@@ -181,7 +188,7 @@ HRESULT NonGcHeapProfiler::GarbageCollectionFinished()
181
188
{
182
189
if (firstObj != obj)
183
190
{
184
- printf (" EnumerateNonGCObjects: firstObj != obj\n !" );
191
+ printf (" FAIL: EnumerateNonGCObjects: firstObj != obj\n !" );
185
192
_failures++;
186
193
}
187
194
}
@@ -192,7 +199,7 @@ HRESULT NonGcHeapProfiler::GarbageCollectionFinished()
192
199
hr = pCorProfilerInfo->IsFrozenObject (obj, &isFrozen);
193
200
if (FAILED (hr) || !isFrozen)
194
201
{
195
- printf (" EnumerateNonGCObjects: IsFrozenObject failed\n !" );
202
+ printf (" FAIL: EnumerateNonGCObjects: IsFrozenObject failed\n !" );
196
203
_failures++;
197
204
}
198
205
@@ -202,7 +209,7 @@ HRESULT NonGcHeapProfiler::GarbageCollectionFinished()
202
209
203
210
if (nonGcObjectsEnumerated != _nonGcHeapObjects)
204
211
{
205
- printf (" objectAllocated(%d) != _nonGcHeapObjects(%d)\n !" , nonGcObjectsEnumerated, (int )_nonGcHeapObjects);
212
+ printf (" FAIL: objectAllocated(%d) != _nonGcHeapObjects(%d)\n !" , nonGcObjectsEnumerated, (int )_nonGcHeapObjects);
206
213
_failures++;
207
214
}
208
215
}
0 commit comments