| #!/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 <System.map> <stackdump.log>" % 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() |