Skip to content

Commit ef76022

Browse files
committedSep 16, 2024
8339197: GenShen: Adding Generation and Evacuation Information JFR Logging
Backport-of: 662d146d52dd77d13cfe705a4a4959c5fb2fb5a1
1 parent c0b27b2 commit ef76022

10 files changed

+318
-11
lines changed
 

‎src/hotspot/share/gc/shenandoah/heuristics/shenandoahGenerationalHeuristics.cpp

+25
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#include "gc/shenandoah/shenandoahGenerationalHeap.hpp"
3232
#include "gc/shenandoah/shenandoahHeapRegion.inline.hpp"
3333
#include "gc/shenandoah/shenandoahOldGeneration.hpp"
34+
#include "gc/shenandoah/shenandoahEvacInfo.hpp"
35+
#include "gc/shenandoah/shenandoahTrace.hpp"
3436

3537
#include "logging/log.hpp"
3638

@@ -73,6 +75,10 @@ void ShenandoahGenerationalHeuristics::choose_collection_set(ShenandoahCollectio
7375
size_t regular_regions_promoted_in_place = 0;
7476
// This counts bytes of memory used by regular regions to be promoted in place.
7577
size_t regular_regions_promoted_usage = 0;
78+
// This counts bytes of memory free in regular regions to be promoted in place.
79+
size_t regular_regions_promoted_free = 0;
80+
// This counts bytes of garbage memory in regular regions to be promoted in place.
81+
size_t regular_regions_promoted_garbage = 0;
7682

7783
for (size_t i = 0; i < num_regions; i++) {
7884
ShenandoahHeapRegion* region = heap->get_region(i);
@@ -110,6 +116,8 @@ void ShenandoahGenerationalHeuristics::choose_collection_set(ShenandoahCollectio
110116
// Region was included for promotion-in-place
111117
regular_regions_promoted_in_place++;
112118
regular_regions_promoted_usage += region->used_before_promote();
119+
regular_regions_promoted_free += region->free();
120+
regular_regions_promoted_garbage += region->garbage();
113121
}
114122
is_candidate = false;
115123
} else {
@@ -216,6 +224,23 @@ void ShenandoahGenerationalHeuristics::choose_collection_set(ShenandoahCollectio
216224
byte_size_in_proper_unit(promote_evac_bytes), proper_unit_for_byte_size(promote_evac_bytes),
217225
byte_size_in_proper_unit(old_evac_bytes), proper_unit_for_byte_size(old_evac_bytes),
218226
byte_size_in_proper_unit(total_evac_bytes), proper_unit_for_byte_size(total_evac_bytes));
227+
228+
ShenandoahEvacInfo evacInfo;
229+
evacInfo.set_collection_set_regions(collection_set->count());
230+
evacInfo.set_collection_set_used_before(collection_set->used());
231+
evacInfo.set_collection_set_used_after(collection_set->live());
232+
evacInfo.set_collected_old(old_evac_bytes);
233+
evacInfo.set_collected_promoted(promote_evac_bytes);
234+
evacInfo.set_collected_young(young_evac_bytes);
235+
evacInfo.set_regions_promoted_humongous(humongous_regions_promoted);
236+
evacInfo.set_regions_promoted_regular(regular_regions_promoted_in_place);
237+
evacInfo.set_regular_promoted_garbage(regular_regions_promoted_garbage);
238+
evacInfo.set_regular_promoted_free(regular_regions_promoted_free);
239+
evacInfo.set_regions_immediate(immediate_regions);
240+
evacInfo.set_immediate_size(immediate_garbage);
241+
evacInfo.set_regions_freed(free_regions);
242+
243+
ShenandoahTracer().report_evacuation_info(&evacInfo);
219244
}
220245
}
221246

‎src/hotspot/share/gc/shenandoah/shenandoahCollectorPolicy.hpp

+1-5
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,10 @@
2929
#include "gc/shared/gcTrace.hpp"
3030
#include "gc/shenandoah/shenandoahGC.hpp"
3131
#include "gc/shenandoah/shenandoahSharedVariables.hpp"
32+
#include "gc/shenandoah/shenandoahTrace.hpp"
3233
#include "memory/allocation.hpp"
3334
#include "utilities/ostream.hpp"
3435

35-
class ShenandoahTracer : public GCTracer, public CHeapObj<mtGC> {
36-
public:
37-
ShenandoahTracer() : GCTracer(Shenandoah) {}
38-
};
39-
4036
class ShenandoahCollectorPolicy : public CHeapObj<mtGC> {
4137
private:
4238
size_t _success_concurrent_gcs;

‎src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.cpp

+46-6
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ void ShenandoahConcurrentGC::entry_final_updaterefs() {
345345
}
346346

347347
void ShenandoahConcurrentGC::entry_final_roots() {
348-
static const char* msg = "Pause Final Roots";
348+
const char* msg = final_roots_event_message();
349349
ShenandoahPausePhase gc_phase(msg, ShenandoahPhaseTimings::final_roots);
350350
EventMark em("%s", msg);
351351

@@ -358,7 +358,7 @@ void ShenandoahConcurrentGC::entry_reset() {
358358

359359
TraceCollectorStats tcs(heap->monitoring_support()->concurrent_collection_counters());
360360
{
361-
static const char* msg = "Concurrent reset";
361+
const char* msg = conc_reset_event_message();
362362
ShenandoahConcurrentPhase gc_phase(msg, ShenandoahPhaseTimings::conc_reset);
363363
EventMark em("%s", msg);
364364

@@ -443,7 +443,7 @@ void ShenandoahConcurrentGC::entry_thread_roots() {
443443

444444
void ShenandoahConcurrentGC::entry_weak_refs() {
445445
ShenandoahHeap* const heap = ShenandoahHeap::heap();
446-
static const char* msg = "Concurrent weak references";
446+
const char* msg = conc_weak_refs_event_message();
447447
ShenandoahConcurrentPhase gc_phase(msg, ShenandoahPhaseTimings::conc_weak_refs);
448448
EventMark em("%s", msg);
449449

@@ -458,7 +458,7 @@ void ShenandoahConcurrentGC::entry_weak_refs() {
458458
void ShenandoahConcurrentGC::entry_weak_roots() {
459459
ShenandoahHeap* const heap = ShenandoahHeap::heap();
460460
TraceCollectorStats tcs(heap->monitoring_support()->concurrent_collection_counters());
461-
static const char* msg = "Concurrent weak roots";
461+
const char* msg = conc_weak_roots_event_message();
462462
ShenandoahConcurrentPhase gc_phase(msg, ShenandoahPhaseTimings::conc_weak_roots);
463463
EventMark em("%s", msg);
464464

@@ -505,7 +505,7 @@ void ShenandoahConcurrentGC::entry_strong_roots() {
505505
void ShenandoahConcurrentGC::entry_cleanup_early() {
506506
ShenandoahHeap* const heap = ShenandoahHeap::heap();
507507
TraceCollectorStats tcs(heap->monitoring_support()->concurrent_collection_counters());
508-
static const char* msg = "Concurrent cleanup";
508+
const char* msg = conc_cleanup_event_message();
509509
ShenandoahConcurrentPhase gc_phase(msg, ShenandoahPhaseTimings::conc_cleanup_early, true /* log_heap_usage */);
510510
EventMark em("%s", msg);
511511

@@ -561,7 +561,7 @@ void ShenandoahConcurrentGC::entry_updaterefs() {
561561
void ShenandoahConcurrentGC::entry_cleanup_complete() {
562562
ShenandoahHeap* const heap = ShenandoahHeap::heap();
563563
TraceCollectorStats tcs(heap->monitoring_support()->concurrent_collection_counters());
564-
static const char* msg = "Concurrent cleanup";
564+
const char* msg = conc_cleanup_event_message();
565565
ShenandoahConcurrentPhase gc_phase(msg, ShenandoahPhaseTimings::conc_cleanup_complete, true /* log_heap_usage */);
566566
EventMark em("%s", msg);
567567

@@ -1252,3 +1252,43 @@ const char* ShenandoahConcurrentGC::conc_mark_event_message() const {
12521252
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Concurrent marking", "");
12531253
}
12541254
}
1255+
1256+
const char* ShenandoahConcurrentGC::conc_reset_event_message() const {
1257+
if (ShenandoahHeap::heap()->unload_classes()) {
1258+
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Concurrent reset", " (unload classes)");
1259+
} else {
1260+
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Concurrent reset", "");
1261+
}
1262+
}
1263+
1264+
const char* ShenandoahConcurrentGC::final_roots_event_message() const {
1265+
if (ShenandoahHeap::heap()->unload_classes()) {
1266+
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Pause Final Roots", " (unload classes)");
1267+
} else {
1268+
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Pause Final Roots", "");
1269+
}
1270+
}
1271+
1272+
const char* ShenandoahConcurrentGC::conc_weak_refs_event_message() const {
1273+
if (ShenandoahHeap::heap()->unload_classes()) {
1274+
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Concurrent weak references", " (unload classes)");
1275+
} else {
1276+
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Concurrent weak references", "");
1277+
}
1278+
}
1279+
1280+
const char* ShenandoahConcurrentGC::conc_weak_roots_event_message() const {
1281+
if (ShenandoahHeap::heap()->unload_classes()) {
1282+
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Concurrent weak roots", " (unload classes)");
1283+
} else {
1284+
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Concurrent weak roots", "");
1285+
}
1286+
}
1287+
1288+
const char* ShenandoahConcurrentGC::conc_cleanup_event_message() const {
1289+
if (ShenandoahHeap::heap()->unload_classes()) {
1290+
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Concurrent cleanup", " (unload classes)");
1291+
} else {
1292+
SHENANDOAH_RETURN_EVENT_MESSAGE(_generation->type(), "Concurrent cleanup", "");
1293+
}
1294+
}

‎src/hotspot/share/gc/shenandoah/shenandoahConcurrentGC.hpp

+5
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,12 @@ class ShenandoahConcurrentGC : public ShenandoahGC {
139139
// passing around the logging/tracing systems
140140
const char* init_mark_event_message() const;
141141
const char* final_mark_event_message() const;
142+
const char* final_roots_event_message() const;
142143
const char* conc_mark_event_message() const;
144+
const char* conc_reset_event_message() const;
145+
const char* conc_weak_refs_event_message() const;
146+
const char* conc_weak_roots_event_message() const;
147+
const char* conc_cleanup_event_message() const;
143148

144149
protected:
145150
// Check GC cancellation and abort concurrent GC
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/*
2+
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*
23+
*/
24+
25+
#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHEVACINFO_HPP
26+
#define SHARE_GC_SHENANDOAH_SHENANDOAHEVACINFO_HPP
27+
28+
#include "memory/allocation.hpp"
29+
30+
class ShenandoahEvacInfo : public StackObj {
31+
// Values for ShenandoahEvacInfo jfr event, sizes stored as bytes
32+
size_t _collection_set_regions;
33+
size_t _collection_set_used_before;
34+
size_t _collection_set_used_after;
35+
size_t _collected_old;
36+
size_t _collected_promoted;
37+
size_t _collected_young;
38+
size_t _regions_promoted_humongous;
39+
size_t _regions_promoted_regular;
40+
size_t _regular_promoted_garbage;
41+
size_t _regular_promoted_free;
42+
size_t _regions_freed;
43+
size_t _regions_immediate;
44+
size_t _immediate_size;
45+
46+
public:
47+
ShenandoahEvacInfo() :
48+
_collection_set_regions(0), _collection_set_used_before(0), _collection_set_used_after(0),
49+
_collected_old(0), _collected_promoted(0), _collected_young(0), _regions_promoted_humongous(0),
50+
_regions_promoted_regular(0), _regular_promoted_garbage(0), _regular_promoted_free(0),
51+
_regions_freed(0), _regions_immediate(0), _immediate_size(0) { }
52+
53+
void set_collection_set_regions(size_t collection_set_regions) {
54+
_collection_set_regions = collection_set_regions;
55+
}
56+
57+
void set_collection_set_used_before(size_t used) {
58+
_collection_set_used_before = used;
59+
}
60+
61+
void set_collection_set_used_after(size_t used) {
62+
_collection_set_used_after = used;
63+
}
64+
65+
void set_collected_old(size_t collected) {
66+
_collected_old = collected;
67+
}
68+
69+
void set_collected_promoted(size_t collected) {
70+
_collected_promoted = collected;
71+
}
72+
73+
void set_collected_young(size_t collected) {
74+
_collected_young = collected;
75+
}
76+
77+
void set_regions_freed(size_t freed) {
78+
_regions_freed = freed;
79+
}
80+
81+
void set_regions_promoted_humongous(size_t humongous) {
82+
_regions_promoted_humongous = humongous;
83+
}
84+
85+
void set_regions_promoted_regular(size_t regular) {
86+
_regions_promoted_regular = regular;
87+
}
88+
89+
void set_regular_promoted_garbage(size_t garbage) {
90+
_regular_promoted_garbage = garbage;
91+
}
92+
93+
void set_regular_promoted_free(size_t free) {
94+
_regular_promoted_free = free;
95+
}
96+
97+
void set_regions_immediate(size_t immediate) {
98+
_regions_immediate = immediate;
99+
}
100+
101+
void set_immediate_size(size_t size) {
102+
_immediate_size = size;
103+
}
104+
105+
size_t collection_set_regions() { return _collection_set_regions; }
106+
size_t collection_set_used_before() { return _collection_set_used_before; }
107+
size_t collection_set_used_after() { return _collection_set_used_after; }
108+
size_t collected_old() { return _collected_old; }
109+
size_t collected_promoted() { return _collected_promoted; }
110+
size_t collected_young() { return _collected_young; }
111+
size_t regions_promoted_humongous() { return _regions_promoted_humongous; }
112+
size_t regions_promoted_regular() { return _regions_promoted_regular; }
113+
size_t regular_promoted_garbage() { return _regular_promoted_garbage; }
114+
size_t regular_promoted_free() { return _regular_promoted_free; }
115+
size_t regions_freed() { return _regions_freed; }
116+
size_t regions_immediate() { return _regions_immediate; }
117+
size_t immediate_size() { return _immediate_size; }
118+
};
119+
120+
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHEVACINFO_HPP
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*
23+
*/
24+
25+
#include "precompiled.hpp"
26+
#include "gc/shenandoah/shenandoahEvacInfo.hpp"
27+
#include "gc/shenandoah/shenandoahTrace.hpp"
28+
#include "jfr/jfrEvents.hpp"
29+
30+
void ShenandoahTracer::report_evacuation_info(ShenandoahEvacInfo* info) {
31+
send_evacuation_info_event(info);
32+
}
33+
34+
void ShenandoahTracer::send_evacuation_info_event(ShenandoahEvacInfo* info) {
35+
EventShenandoahEvacInfo e;
36+
if (e.should_commit()) {
37+
e.set_gcId(GCId::current());
38+
e.set_cSetRegions(info->collection_set_regions());
39+
e.set_cSetUsedBefore(info->collection_set_used_before());
40+
e.set_cSetUsedAfter(info->collection_set_used_after());
41+
e.set_collectedOld(info->collected_old());
42+
e.set_collectedPromoted(info->collected_promoted());
43+
e.set_collectedYoung(info->collected_young());
44+
e.set_regionsPromotedHumongous(info->regions_promoted_humongous());
45+
e.set_regionsPromotedRegular(info->regions_promoted_regular());
46+
e.set_regularPromotedGarbage(info->regular_promoted_garbage());
47+
e.set_regularPromotedFree(info->regular_promoted_free());
48+
e.set_regionsFreed(info->regions_freed());
49+
e.set_regionsImmediate(info->regions_immediate());
50+
e.set_immediateBytes(info->immediate_size());
51+
52+
e.commit();
53+
}
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*
23+
*/
24+
25+
#ifndef SHARE_GC_SHENANDOAH_SHENANDOAHTRACE_HPP
26+
#define SHARE_GC_SHENANDOAH_SHENANDOAHTRACE_HPP
27+
28+
#include "gc/shared/gcTrace.hpp"
29+
#include "memory/allocation.hpp"
30+
31+
class ShenandoahEvacInfo;
32+
33+
class ShenandoahTracer : public GCTracer, public CHeapObj<mtGC> {
34+
public:
35+
ShenandoahTracer() : GCTracer(Shenandoah) {}
36+
void report_evacuation_info(ShenandoahEvacInfo* info);
37+
38+
private:
39+
void send_evacuation_info_event(ShenandoahEvacInfo* info);
40+
};
41+
42+
#endif

‎src/hotspot/share/jfr/metadata/metadata.xml

+17
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,23 @@
11781178
<Field type="string" name="state" label="State" />
11791179
</Type>
11801180

1181+
<Event name="ShenandoahEvacInfo" category="Java Virtual Machine, GC, Detailed" label="Shenandoah Evacuation Information" startTime="false">
1182+
<Field type="uint" name="gcId" label="GC Identifier" relation="GcId" />
1183+
<Field type="ulong" name="cSetRegions" label="Collection Set Regions" />
1184+
<Field type="ulong" contentType="bytes" name="cSetUsedBefore" label="Collection Set Before" description="Memory usage before GC in the collection set regions" />
1185+
<Field type="ulong" contentType="bytes" name="cSetUsedAfter" label="Collection Set After" description="Memory usage after GC in the collection set regions" />
1186+
<Field type="ulong" contentType="bytes" name="collectedOld" label="Collected Old" description="Memory collected from old generation" />
1187+
<Field type="ulong" contentType="bytes" name="collectedPromoted" label="Collected Promoted" description="Memory collected from generation promotion" />
1188+
<Field type="ulong" contentType="bytes" name="collectedYoung" label="Collection Young" description="Memory collected from young generation" />
1189+
<Field type="ulong" name="regionsPromotedHumongous" label="Regions Promoted Humongous" />
1190+
<Field type="ulong" name="regionsPromotedRegular" label="Regions Promoted Regular" />
1191+
<Field type="ulong" contentType="bytes" name="regularPromotedGarbage" label="Regular Promoted Garbage" description="Garbage memory of in place promoted regular regions" />
1192+
<Field type="ulong" contentType="bytes" name="regularPromotedFree" label="Regular Promoted Free" description="Free memory of in place promoted regular regions" />
1193+
<Field type="ulong" name="regionsFreed" label="Regions Freed" description="Free regions prior to determining collection set" />
1194+
<Field type="ulong" name="regionsImmediate" label="Regions Immediate" />
1195+
<Field type="ulong" contentType="bytes" name="immediateBytes" label="Immediate Bytes" />
1196+
</Event>
1197+
11811198
<Event name="Flush" category="Flight Recorder" label="Flush" thread="false" experimental="true">
11821199
<Field type="ulong" name="flushId" label="Flush Identifier" relation="FlushId" />
11831200
<Field type="ulong" name="elements" label="Elements Written" />

‎src/jdk.jfr/share/conf/jfr/default.jfc

+4
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,10 @@
526526
<setting name="enabled" control="gc-enabled-high">false</setting>
527527
</event>
528528

529+
<event name="jdk.ShenandoahEvacInfo">
530+
<setting name="enabled" control="gc-enabled-high">false</setting>
531+
</event>
532+
529533
<event name="jdk.OldObjectSample">
530534
<setting name="enabled" control="old-objects-enabled">true</setting>
531535
<setting name="stackTrace" control="old-objects-stack-trace">false</setting>

‎src/jdk.jfr/share/conf/jfr/profile.jfc

+4
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,10 @@
526526
<setting name="enabled" control="gc-enabled-high">false</setting>
527527
</event>
528528

529+
<event name="jdk.ShenandoahEvacInfo">
530+
<setting name="enabled" control="gc-enabled-high">false</setting>
531+
</event>
532+
529533
<event name="jdk.OldObjectSample">
530534
<setting name="enabled" control="old-objects-enabled">true</setting>
531535
<setting name="stackTrace" control="old-objects-stack-trace">true</setting>

0 commit comments

Comments
 (0)
Please sign in to comment.