Я отлаживаю программу с помощью valgrind и gdb. Однако я варварски завершаю эти сеансы отладки… Неужели это действительно так?
Настройка сеанса отладки
Следуя инструкциям с официального сайта valgrind Для запуска программы я делаю следующее:
Я запускаю valgrind, введя
valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prgm.run
Из другого сеанса терминала я запускаю gdb, используя
gdb ./prgm.run
Подключаю gdb к valgrind
(gdb) target remote | vgdb
Запускаю программу из GDB CLI
(gdb) c
Пока все хорошо: программа работает на обоих терминалах (тот, который используется для valgrind, и тот, который используется для gdb). Затем valgrind находит ошибку, например недопустимое чтение, и выполнение программы приостанавливается.
Завершение сеанса
На этом этапе я хочу поиграть со своим кодом: возможно, исправить что-то или прокомментировать / раскомментировать материал из исходного кода программы. Как следствие, программу нужно компилировать заново. Создается новый двоичный файл. После этого я хочу остановить текущие сеансы valgrind и gdb (которые использовали старый двоичный файл) и запустить новые сеансы valgrind и gdb, которые будут использовать новый двоичный файл.
Чтобы остановить текущий сеанс, я выхожу из gdb
(gdb) q
Иногда valgrind замечает, что gdb больше нет, и тоже закрывается. Но в других случаях valgrind продолжает работать, даже несмотря на то, что процесс gdb больше не существует ...
В этом случае я убиваю процесс memcheck-amd64-, соответствующий моему сеансу valgrind. Номер этого процесса указывается в сообщениях valgrind, например: 16195
в ==16195== Invalid read of size 8
).
kill -9 16195
Обычного убийства недостаточно: мне нужно использовать параметр -9
.
Я не думаю, что вызов kill -9
- это то, как это должно быть сделано… Я что-то упускаю?
версия valgrind: 3.10.1
версия gdb: 7.7.1