flutter_flutter/tools/mojo_cache_linker.py
Eric Seidel 74a45026ac Make --gdb work for android
This mostly works.  I haven't yet set up pulling down the
system binaries from the device to the host so that symbols
appear correctly, but I'll do that in the next patch.

One of the crazy things this patch adds it a script
to watch for loads on adb logcat and set up mappings
from the cache library names to the symboled binaries
in the out directory.  Presumably other scripts may
want to share this functionality so I've made it its
own script.

Better would be to have mojo_shell spit out a file
including the cache mapping information and we could
watch that file instead of logcat, but this works
for now.

R=qsr@chromium.org
BUG=

Review URL: https://codereview.chromium.org/848013004
2015-01-16 11:28:31 -08:00

65 lines
2.2 KiB
Python
Executable File

#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import logging
import os
import re
import sys
# TODO(eseidel): This should be shared with tools/android_stack_parser/stack
# TODO(eseidel): This could be replaced by using build-ids on Android
# TODO(eseidel): mojo_shell should write out a cache mapping file.
def main():
logging.basicConfig(level=logging.INFO)
parser = argparse.ArgumentParser(
description='Watches mojo_shell logcat output and builds a directory '
'of symlinks to symboled binaries for seen cache names.')
parser.add_argument('links_dir', type=str)
parser.add_argument('symbols_dir', type=str)
parser.add_argument('base_url', type=str)
args = parser.parse_args()
regex = re.compile('Caching mojo app (?P<url>\S+) at (?P<path>\S+)')
if not os.path.isdir(args.links_dir):
logging.fatal('links_dir: %s is not a directory' % args.links_dir)
sys.exit(1)
for line in sys.stdin:
result = regex.search(line)
if not result:
continue
url = result.group('url')
if not url.startswith(args.base_url):
logging.debug('%s does not match base %s' % (url, args.base_url))
continue
full_name = os.path.basename(url)
name, ext = os.path.splitext(full_name)
if ext != '.mojo':
logging.debug('%s is not a .mojo library' % url)
continue
symboled_name = 'lib%s_library.so' % name
cache_link_path = os.path.join(args.links_dir,
os.path.basename(result.group('path')))
symboled_path = os.path.realpath(
os.path.join(args.symbols_dir, symboled_name))
if not os.path.isfile(symboled_path):
logging.warn('symboled path %s does not exist' % symboled_path)
continue
print "%s -> %s" % (cache_link_path, symboled_path)
if os.path.lexists(cache_link_path):
logging.debug('link already exists %s, replacing' % symboled_path)
os.unlink(cache_link_path)
os.symlink(symboled_path, cache_link_path)
if __name__ == '__main__':
main()