|  | #!/bin/bash | 
|  | # 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. | 
|  |  | 
|  | # Runs Chrome / content_shell and attaches to the first renderer process in gdb. | 
|  |  | 
|  | RENDERER_PID_RE='Renderer \(([0-9]+)\) paused waiting for debugger' | 
|  | TARGET_FLAGS="--no-sandbox --renderer-startup-dialog" | 
|  | TARGET=$1 | 
|  | shift | 
|  |  | 
|  | if [ -z "$TARGET" ]; then | 
|  | echo "usage: $(basename $0) <path-to-content-shell> [more-args...]" | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | if [ -z "$DEBUGGER" ]; then | 
|  | if which lldb > /dev/null; then | 
|  | DEBUGGER="lldb" | 
|  | CONTINUE="continue" | 
|  | elif which gdb > /dev/null; then | 
|  | DEBUGGER="gdb -q" | 
|  | CONTINUE="signal SIGUSR1" | 
|  | else | 
|  | echo "no debugger found" | 
|  | exit 1 | 
|  | fi | 
|  | fi | 
|  |  | 
|  | OUTPUT=$(mktemp "${TMPDIR:-/tmp}"/"$(basename $0)".XXXXX) | 
|  | "$TARGET" $TARGET_FLAGS "$@" 2>&1 | tee $OUTPUT & | 
|  | BROWSER_PID=$! | 
|  |  | 
|  | wait_renderer_pid() { | 
|  | for i in {1..100}; do | 
|  | browser_running || return | 
|  | RENDERER_PID=$(renderer_pid) | 
|  | [ -n "$RENDERER_PID" ] && return | 
|  | sleep 0.2 | 
|  | done | 
|  | } | 
|  |  | 
|  | browser_running() { ps -p $BROWSER_PID > /dev/null; } | 
|  | renderer_pid() { [[ "$(cat $OUTPUT)" =~ $RENDERER_PID_RE ]] && echo ${BASH_REMATCH[1]}; } | 
|  |  | 
|  | wait_renderer_pid | 
|  | if [ -n "$RENDERER_PID" ]; then | 
|  | # print yellow message | 
|  | echo -e "\n\033[1;33mDebugging renderer, use '$CONTINUE' to run.\033[0m\n" | 
|  | $DEBUGGER -p $RENDERER_PID | 
|  | fi | 
|  |  | 
|  | wait | 
|  | rm $OUTPUT |