| #!/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 |