This page shows how to run automated tests while PBS is running under memory diagnostics tools like valgrind, electric fence or purify
However, this page mostly focus focuses on valgrind Valgrind only but this step can be used to run any diagnostics tools such as code coverage tools, etc...
Step-by-step guide
Compile Python with
valgrindValgrind support
- Install valgrind devel package
- Command: yum install valgrind-devel
- Compile python from source as follow
./configure --prefix=<python_install_dir> --without-pymalloc --with-pydebug --with-valgrind
make
make install
Compile and install PBS with above python and in partial debug mode
- ./configure --prefix=<installdir> --with-python=<python_install_dir> CFLAGS="-g -O0 -DPy_DEBUG -Wall -Werror"
- NOTE: Do not add '-DDEBUG' option in CFLAGS because it will start all PBS daemons in foreground mode which will hang PBS init script forever
- make; make install
Change in pbs_init.d script
NOTE: This step applies only if you are using PBS code before https://github.com/PBSPro/pbspro/commit/d46352b21eb76c38a21849b987b0b9dd719a839a commit
Replace below lines in check_started() as shown
Code Block | ||
---|---|---|
| ||
# strip out everything except executable name prog_name=`echo ${ps_out} | awk '{print $1}' | \ awk -F/ '{print $NF}' | awk '{print $1}'` if [ "${prog_name}" = $2 ] ; then |
with
Code Block | ||
---|---|---|
| ||
# strip out everything except executable name prog_name=`echo ${ps_out} | grep -how "$2"` if [ "x${prog_name}" = "x$2" ] ; then |
Generate diagnostics tool wrapper script for binaries
Code Block | ||
---|---|---|
| ||
#!/bin/bash LOG_DIR= BASE_SUPP= PBS_CONF_FILE=${PBS_CONF_FILE:-/etc/pbs.conf} . "${PBS_CONF_FILE}" ${PBS_EXEC}/libexec/pbs_init.d stop mv "${PBS_EXEC}/sbin/pbs_server.bin" "${PBS_EXEC}/sbin/pbs_server.bin.vgld" cat >"${PBS_EXEC}/sbin/pbs_server.bin"<<-EOF #!/bin/bash exec valgrind --suppressions=<path to valgrind.supp file> generate_valgrind_wrapper() { srcbin="${1}" binname="$(basename ${srcbin})" destbin="${srcbin}.vlgd" if [ -x "${srcbin}" ]; then __val_opts='--tool=memcheck --leak-check=full --track-origins=no' __val_opts="${__val_opts} --child-silent-after-fork=yes" __val_opts="${__val_opts} --logredzone-filesize=<path to location where you want to store logs>/server256 --track-fds=yes" __val_opts="${__val_opts} --log-file=${LOG_DIR}/${binname}_\$(date \"+%s\").log" __val_opts="${__val_opts} --vgdb=no --xml=no" if [ "x${BASE_SUPP}" != "x" -a -f "${PBSBASE_EXEC}/sbin/pbs_server.bin.vgld" \${1+"\$@"} EOF chmod 0755 "${PBS_EXEC}/sbin/pbs_server.bin" mv "${PBS_EXEC}/sbin/pbs_mom" "${PBS_EXEC}/sbin/pbs_mom.vgld" cat >"${PBS_EXEC}/sbin/pbs_mom"<<-EOF #!/bin/bash exec valgrind --suppressions=<path to valgrind.supp file> --tool=memcheck --leak-check=full --track-origins=yes --log-file=<path to location where you want to store logs>/mom_\$(date "+%s").log --vgdb=no "${PBS_EXEC}/sbin/pbs_mom.vgld" \${1+"\$@"} EOF chmod 0755 "${PBS_EXEC}/sbin/pbs_mom" mv "${PBS_EXEC}/sbin/pbs_comm" "${PBS_EXEC}/sbin/pbs_comm.vgld" cat >"${PBS_EXEC}/sbin/pbs_comm"<<-EOF #!/bin/bash exec valgrind --suppressions=<path to valgrind.supp file> --tool=memcheck --leak-check=full --track-origins=yes --log-file=<path to location where you want to store logs>/comm_\$(date "+%s").log --vgdb=no "${PBS_EXEC}/sbin/pbs_comm.vgld" \${1+"\$@"} EOF chmod 0755 "${PBS_EXEC}/sbin/pbs_comm" mv "${PBS_EXEC}/sbin/pbs_sched"SUPP}" ]; then __val_opts="${__val_opts} --suppressions=${BASE_SUPP}" fi __wait_time=5 if [ "X${binname}X" == "Xpbs_server.binX" ]; then __wait_time=$((__wait_time * 4)) fi if [ ! -x "${destbin}" ]; then mv "${srcbin}" "${destbin}" if [ $? -ne 0 ]; then echo "Failed to copy \"${srcbin}\" to \"${destbin}\"" exit 1 fi fi { echo '#!/bin/bash' echo 'if [ "$1" == "--version" ]; then' echo " ${destbin} --version" echo 'else' echo " valgrind ${__val_opts} ${destbin} -N \"\$@\" &" if [ ${__wait_time} -ne 0 ]; then echo " sleep ${__wait_time}" fi echo 'fi' } > /tmp/valwrapper mv /tmp/valwrapper "${srcbin}" if [ $? -ne 0 ]; then echo "Failed to copy valwrapper to \"${srcbin}\"" exit 1 else echo "*** Generated valgrind wrapper for ${srcbin}" echo "========================================" cat "${srcbin}" echo "========================================" fi chmod +x "${srcbin}" fi } usage() { echo "$0 --log-dir <path to valgrind log dir> --base-supp <base suppression file to use>" } parse_params() { while [ $# -gt 0 ] do case $1 in --log-dir) LOG_DIR="$2"; shift 2;; --base-supp) BASE_SUPP="$2"; shift 2;; *) echo "Invalid option: $1"; echo; usage; exit 1;; esac done } parse_params "$@" if [ "x$(id -u)" != "x0" ]; then echo "This script must be run by root!" exit 1 fi if [ "x${LOG_DIR}" == "x" ]; then usage exit 1 fi if [ ! -f ${PBS_CONF_FILE} ]; then echo "Couldn't find pbs.conf!" exit 1 fi . "${PBS_CONF_FILE}" if [ "x${PBS_EXEC}" == "x" ]; then echo "Invalid PBS_EXEC in pbs.conf!" exit 1 fi ${PBS_EXEC}/libexec/pbs_init.d stop mkdir -p "${LOG_DIR}" generate_valgrind_wrapper "${PBS_EXEC}/sbin/pbs_schedserver.vgldbin" catgenerate_valgrind_wrapper >"${PBS_EXEC}/sbin/pbs_schedmom"<<-EOF #!/bin/bash exec valgrind --suppressions=<path to valgrind.supp file> --tool=memcheck --leak-check=full --track-origins=yes --log-file=<path to location where you want to store logs>/sched_\$(date "+%s").log --vgdb=no generate_valgrind_wrapper "${PBS_EXEC}/sbin/pbs_sched.vgld" \${1+"\$@"} EOF chmod 0755 " generate_valgrind_wrapper "${PBS_EXEC}/sbin/pbs_schedcomm" ${PBS_EXEC}/libexec/pbs_init.d start |
NOTENOTES: Above
- The above script only generates wrapper script for all PBS daemons only, but you can modify above script for any binaries which you want to run under diagnostics tool with any options
- The option --vgdb is not supported in Valgrind versions below 3.7.0. Systems with RHEL 6 have valgrind version below 3.7.0.
Now run your automated test.