Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Unified Diff: runtime/observatory/lib/src/elements/heap_snapshot.dart

Issue 2502283003: Add a version of heap snapshots that use only fields and stack frames as roots and only include ins… (Closed)
Patch Set: . Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/observatory/lib/src/elements/heap_snapshot.dart
diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart
index 7389daa2aaea72ea8b4da9e9362cce68612f9534..57cbd43515c154d042c4892450354464ea1fa3f8 100644
--- a/runtime/observatory/lib/src/elements/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart
@@ -17,6 +17,7 @@ import 'package:observatory/src/elements/helpers/nav_bar.dart';
import 'package:observatory/src/elements/helpers/nav_menu.dart';
import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory/src/elements/helpers/tag.dart';
+import 'package:observatory/src/elements/helpers/uris.dart';
import 'package:observatory/src/elements/nav/isolate_menu.dart';
import 'package:observatory/src/elements/nav/notify.dart';
import 'package:observatory/src/elements/nav/refresh.dart';
@@ -24,6 +25,7 @@ import 'package:observatory/src/elements/nav/top_menu.dart';
import 'package:observatory/src/elements/nav/vm_menu.dart';
import 'package:observatory/utils.dart';
+enum HeapSnapshotRoots { user, vm }
enum HeapSnapshotTreeMode { dominatorTree, mergedDominatorTree, groupByClass }
class HeapSnapshotElement extends HtmlElement implements Renderable {
@@ -51,6 +53,7 @@ class HeapSnapshotElement extends HtmlElement implements Renderable {
M.HeapSnapshot _snapshot;
Stream<M.HeapSnapshotLoadingProgressEvent> _progressStream;
M.HeapSnapshotLoadingProgress _progress;
+ HeapSnapshotRoots _roots = HeapSnapshotRoots.user;
HeapSnapshotTreeMode _mode = HeapSnapshotTreeMode.dominatorTree;
M.IsolateRef get isolate => _isolate;
@@ -138,7 +141,9 @@ class HeapSnapshotElement extends HtmlElement implements Renderable {
Future _refresh() async {
_progress = null;
- _progressStream = _snapshots.get(isolate);
+ _progressStream = _snapshots.get(isolate,
+ roots: rootsToString(_roots),
+ gc: true);
_r.dirty();
_progressStream.listen((e) {
_progress = e.progress;
@@ -233,6 +238,16 @@ class HeapSnapshotElement extends HtmlElement implements Renderable {
..children = [
new DivElement()
..classes = ['memberName']
+ ..text = 'Roots ',
+ new DivElement()
+ ..classes = ['memberName']
+ ..children = _createRootsSelect()
+ ],
+ new DivElement()
+ ..classes = ['memberItem']
+ ..children = [
+ new DivElement()
+ ..classes = ['memberName']
..text = 'Analysis ',
new DivElement()
..classes = ['memberName']
@@ -396,11 +411,20 @@ class HeapSnapshotElement extends HtmlElement implements Renderable {
..classes = ['name']
..text = 'Loading...';
element.children[4] = wrapper;
- node.object.then((object) {
+ if (node.isStack) {
wrapper
..text = ''
- ..children = [anyRef(_isolate, object, _instances, queue: _r.queue)];
- });
+ ..children = [
+ new AnchorElement(href: Uris.debugger(isolate))
+ ..text = 'stack frames'
+ ];
+ } else {
+ node.object.then((object) {
+ wrapper
+ ..text = ''
+ ..children = [anyRef(_isolate, object, _instances, queue: _r.queue)];
+ });
+ }
}
void _updateMergedDominator(
@@ -418,14 +442,23 @@ class HeapSnapshotElement extends HtmlElement implements Renderable {
..classes = ['name']
..text = 'Loading...';
element.children[4] = wrapper;
- node.klass.then((klass) {
+ if (node.isStack) {
wrapper
..text = ''
..children = [
- new SpanElement()..text = '${node.instanceCount} instances of ',
- anyRef(_isolate, klass, _instances, queue: _r.queue)
+ new AnchorElement(href: Uris.debugger(isolate))
+ ..text = 'stack frames'
];
- });
+ } else {
+ node.klass.then((klass) {
+ wrapper
+ ..text = ''
+ ..children = [
+ new SpanElement()..text = '${node.instanceCount} instances of ',
+ anyRef(_isolate, klass, _instances, queue: _r.queue)
+ ];
+ });
+ }
}
void _updateGroup(HtmlElement element, item, int depth) {
@@ -487,6 +520,34 @@ class HeapSnapshotElement extends HtmlElement implements Renderable {
}
}
+ static String rootsToString(HeapSnapshotRoots roots) {
+ switch (roots) {
+ case HeapSnapshotRoots.user:
+ return 'User';
+ case HeapSnapshotRoots.vm:
+ return 'VM';
+ }
+ throw new Exception('Unknown HeapSnapshotRoots');
+ }
+
+ List<Element> _createRootsSelect() {
+ var s;
+ return [
+ s = new SelectElement()
+ ..classes = ['roots-select']
+ ..value = rootsToString(_roots)
+ ..children = HeapSnapshotRoots.values.map((roots) {
+ return new OptionElement(
+ value: rootsToString(roots),
+ selected: _roots == roots)..text = rootsToString(roots);
+ }).toList(growable: false)
+ ..onChange.listen((_) {
+ _roots = HeapSnapshotRoots.values[s.selectedIndex];
+ _refresh();
+ })
+ ];
+ }
+
static String modeToString(HeapSnapshotTreeMode mode) {
switch (mode) {
case HeapSnapshotTreeMode.dominatorTree:
@@ -496,7 +557,7 @@ class HeapSnapshotElement extends HtmlElement implements Renderable {
case HeapSnapshotTreeMode.groupByClass:
return 'Group by class';
}
- throw new Exception('Unknown ProfileTreeMode');
+ throw new Exception('Unknown HeapSnapshotTreeMode');
}
List<Element> _createModeSelect() {

Powered by Google App Engine
This is Rietveld 408576698