Выйти из 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

    (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

7 голосов | спросил Gael Lorieul 9 J0000006Europe/Moscow 2016, 19:26:20

3 ответа


0

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

(gdb)monitor v.kill

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

ответил bucket 9 J0000006Europe/Moscow 2017, 23:43:30
0

Предыдущие ответы у меня не сработали, поэтому я нашел это который добился цели.

  1. (gdb) info inferiors Если вы перечислите всех подчиненных в сеансе GDB, найдите того, в качестве имени которого указана «удаленная цель», запомните число слева из этого (будет 1, если нет других подчиненных, работающих в GDB)
  2. (gdb) kill inferiors <number> Замените <number> на младший номер.
  3. (gdb) quit литий>
ответил Foffle 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 07 Sep 2018 02:01:03 +0300 2018, 02:01:03
0

У меня работает следующее:

  1. Отсоединиться от gdb первым: (gdb) detach.
  2. Затем выйдите из gdb: (gdb) quit .
  3. Тогда CTRL + C valgrind.
ответил apmattil 27 TueEurope/Moscow2016-12-27T13:07:46+03:00Europe/Moscow12bEurope/MoscowTue, 27 Dec 2016 13:07:46 +0300 2016, 13:07:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132