Fix parsing of WM trace in critical mode

When tracing WM in critical mode, the children object is not always
assigned and this previously crashed the WM trace parsing in winscope.

Fix the WM trace parsing by assuming all null children as empty arrays

Test: run winscope, collect critical trace, open critical trace in
winscope

Change-Id: Ib98c820969df56eee822fedc66897deb600857e7
This commit is contained in:
Nataniel Borges
2021-09-29 15:59:01 +02:00
parent 7e98ceebb6
commit 757ca2aa0d
12 changed files with 20 additions and 12 deletions

View File

@@ -230,7 +230,7 @@ class WindowManagerTraceSelectedConfig:
# defaults set for all configs
self.selectedConfigs = {
"wmbuffersize": "16000",
"tracinglevel": "all",
"tracinglevel": "debug",
"tracingtype": "frame",
}

View File

@@ -234,8 +234,8 @@ const WM_SELECTED_CONFIG = {
'transaction',
],
'tracinglevel': [
'all',
'trim',
'verbose',
'debug',
'critical',
],
};

View File

@@ -537,6 +537,7 @@ function decodeAndTransformProto(buffer, params, displayDefaults) {
// From S onwards, returns a LayerTrace object, iterating over multiple items allows
// winscope to handle both the new and legacy formats
// TODO Refactor the decode.js code into a set of decoders to clean up the code
let lastError = null;
for (var x = 0; x < objTypesProto.length; x++) {
const objType = objTypesProto[x];
const transform = transforms[x];
@@ -546,9 +547,14 @@ function decodeAndTransformProto(buffer, params, displayDefaults) {
const transformed = transform(decoded);
return transformed;
} catch (e) {
lastError = e;
// check next parser
}
}
if (lastError) {
throw lastError;
}
throw new UndetectableFileType('Unable to parse file');
}

View File

@@ -89,7 +89,8 @@ function createWindowManagerPolicy(proto: any): WindowManagerPolicy {
function createRootWindowContainer(proto: any): RootWindowContainer {
const windowContainer = WindowContainer.fromProto(
/* proto */ proto.windowContainer,
/* childrenProto */ proto.windowContainer.children.reverse()
/* childrenProto */ proto.windowContainer?.children?.reverse() ?? [],
/* isActivityInTree */ false
);
if (windowContainer == null) {

View File

@@ -25,7 +25,7 @@ Activity.fromProto = function (proto: any): Activity {
} else {
const windowContainer = WindowContainer.fromProto(
/* proto */ proto.windowToken.windowContainer,
/* protoChildren */ proto.windowToken.windowContainer.children.reverse(),
/* protoChildren */ proto.windowToken.windowContainer?.children?.reverse() ?? [],
/* isActivityInTree */ true,
/* nameOverride */ null,
/* identifierOverride */ proto.identifier

View File

@@ -24,7 +24,7 @@ DisplayArea.fromProto = function (proto: any, isActivityInTree: Boolean): Displa
} else {
const windowContainer = WindowContainer.fromProto(
/* proto */ proto.windowContainer,
/* protoChildren */ proto.windowContainer.children.reverse(),
/* protoChildren */ proto.windowContainer?.children?.reverse() ?? [],
/* isActivityInTree */ isActivityInTree,
/* nameOverride */ proto.name
);

View File

@@ -24,7 +24,7 @@ DisplayContent.fromProto = function (proto: any, isActivityInTree: Boolean): Dis
} else {
const windowContainer = WindowContainer.fromProto(
/* proto */ proto.rootDisplayArea.windowContainer,
/* protoChildren */ proto.rootDisplayArea.windowContainer.children.reverse(),
/* protoChildren */ proto.rootDisplayArea.windowContainer?.children?.reverse() ?? [],
/* isActivityInTree */ isActivityInTree,
/* nameOverride */ proto.displayInfo?.name ?? null
);

View File

@@ -25,7 +25,7 @@ Task.fromProto = function (proto: any, isActivityInTree: Boolean): Task {
const windowContainerProto = proto.taskFragment?.windowContainer ?? proto.windowContainer;
const windowContainer = WindowContainer.fromProto(
/* proto */ windowContainerProto,
/* protoChildren */ windowContainerProto.children.reverse(),
/* protoChildren */ windowContainerProto?.children?.reverse() ?? [],
/* isActivityInTree */ isActivityInTree
);

View File

@@ -24,7 +24,7 @@ TaskFragment.fromProto = function (proto: any, isActivityInTree: Boolean): TaskF
} else {
const windowContainer = WindowContainer.fromProto(
/* proto */ proto.windowContainer,
/* protoChildren */ proto.windowContainer.children.reverse(),
/* protoChildren */ proto.windowContainer?.children?.reverse() ?? [],
/* isActivityInTree */ isActivityInTree);
const entry = new TaskFragment(
proto.activityType,

View File

@@ -47,7 +47,8 @@ WindowContainer.fromProto = function (
const children = protoChildren
.filter(it => it != null)
.map(it => WindowContainer.childrenFromProto(it, isActivityInTree));
.map(it => WindowContainer.childrenFromProto(it, isActivityInTree))
.filter(it => it != null);
const identifier = identifierOverride ?? proto.identifier;
var name = nameOverride ?? identifier?.title ?? "";

View File

@@ -29,7 +29,7 @@ import WindowContainer from "./WindowContainer"
const name = getName(identifierName);
const windowContainer = WindowContainer.fromProto(
/* proto */ proto.windowContainer,
/* protoChildren */ proto.windowContainer.children.reverse(),
/* protoChildren */ proto.windowContainer?.children.reverse() ?? [],
/* isActivityInTree */ isActivityInTree,
/* nameOverride */ name,
/* identifierOverride */ proto.identifier

View File

@@ -25,7 +25,7 @@ WindowToken.fromProto = function (proto: any, isActivityInTree: Boolean): Window
const windowContainer = WindowContainer.fromProto(
/* proto */ proto.windowContainer,
/* protoChildren */ proto.windowContainer.children.reverse(),
/* protoChildren */ proto.windowContainer?.children?.reverse() ?? [],
/* isActivityInTree */ isActivityInTree,
/* nameOverride */ null,
/* identifierOverride */ null,