| #!/bin/bash |
| |
| # Copyright (c) 2012 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. |
| |
| # This is a small script for manually launching valgrind, along with passing |
| # it the suppression file, and some helpful arguments (automatically attaching |
| # the debugger on failures, etc). Run it from your repo root, something like: |
| # $ sh ./tools/valgrind/valgrind.sh ./out/Debug/chrome |
| # |
| # This is mostly intended for running the chrome browser interactively. |
| # To run unit tests, you probably want to run chrome_tests.sh instead. |
| # That's the script used by the valgrind buildbot. |
| |
| export THISDIR=`dirname $0` |
| |
| setup_memcheck() { |
| RUN_COMMAND="valgrind" |
| |
| # Prompt to attach gdb when there was an error detected. |
| DEFAULT_TOOL_FLAGS=("--db-command=gdb -nw %f %p" "--db-attach=yes" \ |
| # Keep the registers in gdb in sync with the code. |
| "--vex-iropt-register-updates=allregs-at-mem-access" \ |
| # Overwrite newly allocated or freed objects |
| # with 0x41 to catch inproper use. |
| "--malloc-fill=41" "--free-fill=41" \ |
| # Increase the size of stacks being tracked. |
| "--num-callers=30") |
| } |
| |
| setup_unknown() { |
| echo "Unknown tool \"$TOOL_NAME\" specified, the result is not guaranteed" |
| DEFAULT_TOOL_FLAGS=() |
| } |
| |
| set -e |
| |
| if [ $# -eq 0 ]; then |
| echo "usage: <command to run> <arguments ...>" |
| exit 1 |
| fi |
| |
| TOOL_NAME="memcheck" |
| declare -a DEFAULT_TOOL_FLAGS[0] |
| |
| # Select a tool different from memcheck with --tool=TOOL as a first argument |
| TMP_STR=`echo $1 | sed 's/^\-\-tool=//'` |
| if [ "$TMP_STR" != "$1" ]; then |
| TOOL_NAME="$TMP_STR" |
| shift |
| fi |
| |
| if echo "$@" | grep "\-\-tool" ; then |
| echo "--tool=TOOL must be the first argument" >&2 |
| exit 1 |
| fi |
| |
| case $TOOL_NAME in |
| memcheck*) setup_memcheck "$1";; |
| *) setup_unknown;; |
| esac |
| |
| |
| SUPPRESSIONS="$THISDIR/$TOOL_NAME/suppressions.txt" |
| |
| CHROME_VALGRIND=`sh $THISDIR/locate_valgrind.sh` |
| if [ "$CHROME_VALGRIND" = "" ] |
| then |
| # locate_valgrind.sh failed |
| exit 1 |
| fi |
| echo "Using valgrind binaries from ${CHROME_VALGRIND}" |
| |
| set -x |
| PATH="${CHROME_VALGRIND}/bin:$PATH" |
| # We need to set these variables to override default lib paths hard-coded into |
| # Valgrind binary. |
| export VALGRIND_LIB="$CHROME_VALGRIND/lib/valgrind" |
| export VALGRIND_LIB_INNER="$CHROME_VALGRIND/lib/valgrind" |
| |
| # G_SLICE=always-malloc: make glib use system malloc |
| # NSS_DISABLE_UNLOAD=1: make nss skip dlclosing dynamically loaded modules, |
| # which would result in "obj:*" in backtraces. |
| # NSS_DISABLE_ARENA_FREE_LIST=1: make nss use system malloc |
| # G_DEBUG=fatal_warnings: make GTK abort on any critical or warning assertions. |
| # If it crashes on you in the Options menu, you hit bug 19751, |
| # comment out the G_DEBUG=fatal_warnings line. |
| # |
| # GTEST_DEATH_TEST_USE_FORK=1: make gtest death tests valgrind-friendly |
| # |
| # When everyone has the latest valgrind, we might want to add |
| # --show-possibly-lost=no |
| # to ignore possible but not definite leaks. |
| |
| G_SLICE=always-malloc \ |
| NSS_DISABLE_UNLOAD=1 \ |
| NSS_DISABLE_ARENA_FREE_LIST=1 \ |
| G_DEBUG=fatal_warnings \ |
| GTEST_DEATH_TEST_USE_FORK=1 \ |
| $RUN_COMMAND \ |
| --trace-children=yes \ |
| --leak-check=yes \ |
| --suppressions="$SUPPRESSIONS" \ |
| "${DEFAULT_TOOL_FLAGS[@]}" \ |
| "$@" |