Mesa (main): bin: Add a script for filtering/sorting refcount logs
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon May 2 17:43:19 UTC 2022
Module: Mesa
Branch: main
Commit: 0bcb5f919ed5c6ecac7395fd06c6bc71601dbd86
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0bcb5f919ed5c6ecac7395fd06c6bc71601dbd86
Author: Jesse Natalie <jenatali at microsoft.com>
Date: Tue Apr 26 12:36:09 2022 -0700
bin: Add a script for filtering/sorting refcount logs
Reviewed-by: Sil Vilerino <sivileri at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16182>
---
bin/refcnt-log-helper.py | 78 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/bin/refcnt-log-helper.py b/bin/refcnt-log-helper.py
new file mode 100644
index 00000000000..d703f023389
--- /dev/null
+++ b/bin/refcnt-log-helper.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python3
+# Copyright © Microsoft Corporation
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice (including the next
+# paragraph) shall be included in all copies or substantial portions of the
+# Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+
+import argparse
+
+# Take a log file produced by GALLIUM_REFCNT_LOG, filter it to the objects that
+# weren't destroyed by the end of the log, and write the results out sorted.
+# Strips stacks by default to prevent OOM. Could probably be rewritten to walk
+# the file twice to preserve stacks without OOM, but this was the easy way.
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--input',
+ action='store',
+ required=True,
+ help='path to file containing refcount log')
+ parser.add_argument('--output',
+ action='store',
+ required=True,
+ help='path to trimmed log')
+ parser.add_argument('--filter',
+ help='object type filter')
+ parser.add_argument('--keep-stacks',
+ help='keep stacks, otherwise only headers')
+ args = parser.parse_args()
+
+ objects = {}
+
+ with open(args.input) as in_file:
+ stack = []
+ cur_object = ''
+
+ for line in in_file:
+ if line[0] == '<':
+
+ parts = line.split(' ')
+ prev_object = cur_object
+ cur_object = parts[1]
+ if parts[3].strip() == 'Destroy':
+ if cur_object in objects:
+ del objects[cur_object]
+ else:
+ if parts[3].strip() == 'Create':
+ if (not args.filter) or (args.filter in parts[0]):
+ objects[cur_object] = []
+ if prev_object in objects:
+ objects[prev_object] += stack
+
+ stack = [line]
+ elif args.keep_stacks:
+ stack += line
+
+ with open(args.output, 'wt') as out_file:
+ for stack in objects.values():
+ for stack_line in stack:
+ out_file.write(stack_line)
+
+
+if __name__ == '__main__':
+ main()
More information about the mesa-commit
mailing list