Как я могу valgrind memcheck на каждом экземпляре процесса, не запуская его с помощью параметров команды valgrind - PullRequest
3 голосов
/ 06 августа 2009

как мне выполнить проверку памяти valgrind на каждом экземпляре Process, не запуская его с помощью параметров команды valgrind.

Есть ли способ сохранить параметры мониторинга в процессе, а не запускать процесс каждый раз при помощи команды valgrind?

В Microsoft Application Verifier, если приложение указано для отслеживания, выполняется мониторинг любого количества экземпляров этого приложения, независимо от того, является ли оно дочерним процессом или запущено иначе.

Какие-нибудь идеи сделать то же самое в Valgrind?

Я попробовал --trace-children = yes опцию valgrind memcheck ... но мое приложение xyz сигнализирует другое приложение zzz, чтобы запустить новый экземпляр xyz (процесс), который я хочу проанализировать. в этом случае valgrind завершается, когда xyz завершает передачу сигнала zzz. он не отслеживает, какой процесс запущен zzz.

Спасибо, Виджей

Ответы [ 3 ]

4 голосов
/ 06 августа 2009

IIRC, Valgrind должен выполнить приложение, потому что оно изменяет символы только для чтения, чтобы заменить общие библиотечные функции, такие как malloc и т. Д.

Это означает, что вы не можете присоединить memcheck к уже запущенному процессу, потому что он не может изменить этот раздел программы в памяти (и это, вероятно, повредит состояние выполнения).

Возможно, есть и другие причины. quick google предполагает, что вы не можете прикрепить memcheck и к запущенному процессу. Как и предполагалось, вы можете обернуть свои исполняемые файлы в скрипт bash, например. Поэтому, если программа myprog создает новые процессы newprog, выполните:

]$ mv /path/to/myprog /path/to/newprog

тогда

#!/bin/bash
valgrind (options) /path/to/newprog $@

и назовите его myprog $@ гарантирует передачу аргументов. Затем, когда ваша программа создаст новый процесс, используя myprog -a b -c d, он будет заключен в valgrind.

Это относится только к определенным вызовам C, таким как execve() и другим, тогда как другие непонятные способы создания процессов могут не использовать преимущества упаковки.

Если я ошибаюсь, было бы неплохо знать:)

2 голосов
/ 06 августа 2009

Можете ли вы обернуть xyz в пакетный файл или другой исполняемый файл, который запускает его в valgrind?

Другими словами, переименуйте xyz в run_me_under_valgrind, затем создайте новый xyz, который запускает исходный run_me_under_valgrind под valgrind.

0 голосов
/ 19 февраля 2018

Что касается исполняемых файлов оболочки, я получил следующий скрипт для PostgreSQL. (Я обрезал различные части, специфичные для postgres, например, обнаружил предоставленный файл подавлений valgrind).

#!/bin/bash
set -e -u -x

# Pop top two elements from path; the first is added by pg_regress
# and the next is us.
function join_by { local IFS="$1"; shift; echo "$*"; }
IFS=':' read -r -a PATHA <<< "$PATH"
export PATH=$(join_by ":" "${PATHA[@]:2}")

NEXT_POSTGRES=$(which postgres)
if [ "${NEXT_POSTGRES}" -ef "./valgrind/postgres" ]; then
    echo "ERROR: attempt to execute self"
    exit 1
fi

echo "Running ${NEXT_POSTGRES} under Valgrind"

valgrind --leak-check=full --show-leak-kinds=definite,possible \
    --gen-suppressions=all --verbose --time-stamp=yes  \
    --log-file=valgrind-$$-%p.log --trace-children=yes \
    --track-origins=yes --read-var-info=yes --malloc-fill=8f \
    --free-fill=9f --num-callers=30 postgres "$@"

Обратите внимание на манипуляцию PATH, чтобы гарантировать, что мы не попытаемся выполнить postgres из того же места снова. В этом случае было необходимо, чтобы скрипт-обертка также был назван точно postgres, поэтому я должен был убедиться, что он не выполняет рекурсивно сам.

Альтернативой является использование whatis -a, чтобы найти следующий исполняемый файл в пути и запустить его напрямую. Но я обнаружил, что это вызвало другие проблемы для моего варианта использования.


Кстати, если вы получаете сообщение об ошибке типа

   valgrind: mmap(0x58000000, 2347008) failed in UME with error 22 (Invalid argument).
   valgrind: this can be caused by executables with very large text, data or bss segments.

... тогда вполне возможно, что вы пытаетесь запустить valgrind под valgrind по ошибке.

...