125 lines
3.8 KiB
Bash
125 lines
3.8 KiB
Bash
|
#!/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"
|
||
|
GDB=gdb
|
||
|
EXE_INFO=$(file $1)
|
||
|
if [[ $? -eq 0 ]]; then
|
||
|
# Prefer a gdb that matches the executable if it's available.
|
||
|
if [[ "$EXE_INFO" == *32-bit* && -x /usr/bin/gdb32 ]]; then
|
||
|
GDB="/usr/bin/gdb32";
|
||
|
elif [[ "$EXE_INFO" == *64-bit* && -x /usr/bin/gdb64 ]]; then
|
||
|
GDB="/usr/bin/gdb64";
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
# 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_tsan() {
|
||
|
RUN_COMMAND="valgrind-tsan.sh"
|
||
|
IGNORE_FILE="$THISDIR/tsan/ignores.txt"
|
||
|
DEFAULT_TOOL_FLAGS=("--announce-threads" "--pure-happens-before=yes" \
|
||
|
"--ignore=$IGNORE_FILE")
|
||
|
}
|
||
|
|
||
|
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";;
|
||
|
tsan*) setup_tsan;;
|
||
|
*) 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[@]}" \
|
||
|
"$@"
|