Завершите работу valgrind при отладке с помощью gdb

Я отлаживаю программу с помощью valgrind и gdb. Однако я варварски завершаю эти сеансы отладки… Неужели это действительно так?

Настройка сеанса отладки

Следуя инструкциям с официального сайта valgrind Для запуска программы я делаю следующее:

  1. Я запускаю valgrind, введя

    valgrind --tool=memcheck --vgdb=yes --vgdb-error=0 ./prgm.run 
    
  2. Из другого сеанса терминала я запускаю gdb, используя

    gdb ./prgm.run
    
  3. Подключаю gdb к valgrind

    (gdb) target remote | vgdb
    
  4. Запускаю программу из 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


person Gael Lorieul    schedule 09.06.2016    source источник
comment
По-прежнему проблема с использованием valgrind v3.11.0 и gdb RHEL 7.11-67.el6.   -  person John Greene    schedule 21.06.2017


Ответы (2)


вы также можете использовать команду

(gdb)monitor v.kill

он был указан в справке по монитору на gdb.

person bucket    schedule 09.06.2017
comment
В приглашении gdb (GNU gdb RHEL v7.11-67.el6) monitor v.kill привело к: `` команда монитора не поддерживается этой целью. `` '' - person John Greene; 21.06.2017
comment
@Egbert, вероятно, ваша версия gdb отличается от моей (v 8.0). Попробуйте справку по монитору команд, чтобы узнать, есть ли в вашей версии gdb другая команда, чтобы убить процесс valgrind. - person bucket; 15.07.2017

Предыдущие ответы не помогли мне, поэтому я нашел это Что сделало свое дело.

  1. (gdb) info inferiors Должен перечислить все подчиненные в сеансе gdb, найти тот, у которого в качестве имени есть «удаленная цель», обратите внимание на число слева от него (будет 1, если другие подчиненные не работают в gdb)
  2. (gdb) kill inferiors <number> Замените <number> второстепенным номером.
  3. (gdb) quit
person Foffle    schedule 06.09.2018