blob: c10347b9d3dec8823d9907178ec4528245cf14a6 [file] [log] [blame]
#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# $1 - gdb binary path
# $2 - pid of the Impala process
# $3 - Output directory to copy the sharedlibs to.
set -euxo pipefail
if [ "$#" -ne 3 ]; then
echo "Incorrect usage. Expected: $0 <gdb executable path> <target PID> <output dir>"
exit 1
fi
gdb=$1
target=$2
dest_dir=$3
if [ ! -d $dest_dir ]; then
echo "Directory $dest_dir does not exist. This script expects the output directory to exist."
exit 1
fi
# Generate the list of shared libs path to copy.
shared_libs_to_copy=$(mktemp)
$gdb --pid $target --batch -ex 'info shared' 2> /dev/null | sed '1,/Shared Object Library/d' |
sed 's/\(.*\s\)\(\/.*\)/\2/' | grep \/ > $shared_libs_to_copy
echo "Generated shared library listing for the process."
# Copy the files to the target directory keeping the directory structure intact.
# We use rsync instead of 'cp --parents' since the latter has permission issues
# copying from system level directories. https://goo.gl/6yYNhw
rsync -LR --files-from=$shared_libs_to_copy / $dest_dir
echo "Copied the shared libraries to the target directory: $dest_dir"
rm -f $shared_libs_to_copy
# Make sure the impala user has write permissions on all the copied sharedlib paths.
chmod 755 -R $dest_dir