Source code
Revision control
Copy as Markdown
Other Tools
# Copyright 2018 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 logging
import os
import subprocess
from common import SDK_ROOT
from common import GetHostArchFromPlatform
from common import GetHostToolPathFromPlatform
def BuildIdsPaths(package_paths):
"""Generates build ids paths for symbolizer processes."""
build_ids_paths = map(
lambda package_path: os.path.join(
os.path.dirname(package_path), 'ids.txt'),
package_paths)
return build_ids_paths
def RunSymbolizer(input_file, output_file, build_ids_files):
"""Starts a symbolizer process.
input_file: Input file to be symbolized.
output_file: Output file for symbolizer stdout and stderr.
build_ids_file: Path to the ids.txt file which maps build IDs to
unstripped binaries on the filesystem.
Returns a Popen object for the started process."""
symbolizer = GetHostToolPathFromPlatform('symbolizer')
symbolizer_cmd = [
symbolizer, '--build-id-dir',
os.path.join(SDK_ROOT, '.build-id')
]
for build_ids_file in build_ids_files:
symbolizer_cmd.extend(['--ids-txt', build_ids_file])
logging.info('Running "%s".' % ' '.join(symbolizer_cmd))
return subprocess.Popen(symbolizer_cmd, stdin=input_file, stdout=output_file,
stderr=subprocess.STDOUT, close_fds=True)
def SymbolizerFilter(input_file, build_ids_files):
"""Symbolizes an output stream from a process.
input_file: Input file to be symbolized.
build_ids_file: Path to the ids.txt file which maps build IDs to
unstripped binaries on the filesystem.
Returns a generator that yields symbolized process output."""
symbolizer_proc = RunSymbolizer(input_file, subprocess.PIPE, build_ids_files)
while True:
# TODO(chonggu): Switch to encoding='utf-8' once we drop Python 2
# support.
line = symbolizer_proc.stdout.readline().decode('utf-8')
if not line:
break
# Skip spam emitted by the symbolizer that obscures the symbolized output.
if '[[[ELF ' in line:
continue
yield line
symbolizer_proc.wait()