2013-05-02 1 views
2

Если ошибки найдены в выходе valgrind, я хочу сгенерировать вывод с помощью отладочной версии программы. Тем не менее, валидация тысяч прогонов в отладке слишком трудоемкая.Есть ли способ остановить Valgrind на первой ошибке, которую он обнаружил?

Так что я хотел бы сделать, запускается в режиме деблокирования, и если обнаружена ошибка, прервите выполнение и завершите тестирование при отладке.

Не удалось контролировать выход и убить процесс вручную, есть ли лучшее решение?

ответ

0

Вы можете использовать

valgrind --gen-suppressions=no|yes|all 

, как это в настоящее время стоит - его для подавленных, но я уверен, что это будет соответствовать вашим потребностям.

2

Вы можете использовать --db-attach=yes и --db-command= для выполнения определенной команды, которую хотите остановить выполнение Valgrind. Но для обычного процесса отладки --db-command вызывает gdb с дочерним процессом. Таким образом, вы не можете остановить выполнение, убив процесс, используя --db-command=kill -9 %p, потому что он просто убивает дочерний процесс, а не сам Valgrind.

Если вы используете Linux и имеете поддержку файловой системы /proc, вы можете получить номер родительского процесса в 4-м столбце в /proc/PID/stat. Таким образом, у вас есть шанс убить родительский процесс, чтобы остановить Valgrind.

Например,

valgrind --db-attach=yes --db-command="cat /proc/%p/stat | cut -d' ' -f4 | xargs kill -9" ./a.out

Когда появится первая ошибка, вам будет предложено

---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ----

И когда вы нажимаете Y, он будет пытаться вызвать команду отладки. Таким образом, в этом случае он получит идентификатор родительского процесса, который является valgrind, и передаст сигнал KILL процессу. Поэтому Valgrind немедленно прекращается.

1

Так что я хотел бы сделать, запускается в режиме деблокирования, и если обнаружена ошибка, прервите выполнение и завершите тестирование при отладке.

Если у вас есть два исполняемых файла: a.out и a.out-g, и вы хотите запускать их с разными наборами аргументов, это должно работать в bash:

# Arguments to try 
args=(
    "-foo" 
    "-foo -bar" 
    "-bar -baz" 
    ... 
) 
for a in "${args[@]}"; do 
    if valgrind -q --error-exitcode=1 \ 
     --db-attach=yes --db-command="kill -9 %p" ./a.out $a; then 
    echo PASS: ./a.out $a 
    else 
    echo FAIL: ./a.out $a 
    valgrind ./a.out-g $a 
    fi 
done