From 31a2c2211262503a5817a76a9260b9b0340d5dbc Mon Sep 17 00:00:00 2001 From: SPRESENSE <41312067+SPRESENSE@users.noreply.github.com> Date: Tue, 20 Jun 2023 14:51:58 +0900 Subject: [PATCH] tools: Add script to parse callstack Add 'callstack.py' script for parsing stack dump log to callstack. --- tools/callstack.py | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 tools/callstack.py diff --git a/tools/callstack.py b/tools/callstack.py new file mode 100755 index 0000000000..a947fadcd6 --- /dev/null +++ b/tools/callstack.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python3 +# tools/callstack.py +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# + +import sys + +syms = [] + + +def get_symbol(x): + try: + addr = int(x, 16) + except ValueError: + return + for num in range(len(syms) - 1): + if syms[num][0] <= addr and addr < syms[num + 1][0]: + return "[%08x] " % (addr) + syms[num][1] + " + 0x%x" % (addr - syms[num][0]) + + +def main(): + argv = sys.argv + argc = len(argv) + + if argc < 3: + print("Usage: python %s " % argv[0]) + quit() + + for line in open(argv[1], "r"): + try: + address, type, symbol = line[:-1].split(" ") + if type == "T" or type == "t" or type == "W" or type == "w": + syms.append((int(address, 16), symbol)) + except AttributeError: + pass + + callstack = [] + for line in open(argv[2], "r"): + print(line[:-1]) + if "stack_dump:" in line: + for item in line.split(" "): + callstack.append(get_symbol(item)) + + print("----------------- callstack -----------------") + for cs in callstack: + if cs is not None: + print(cs) + + +if __name__ == "__main__": + main()