Цитируется из Вот.
gdb помещает отлаженный процесс в свой собственный pgrp и устанавливает терминал на этот pgrp. (Попробуйте, например, ps j для PID gdb и отлаживаемой программы.)
И что это значит
ps j в PID gdb и отлаживаемой программы
это значит ps j PID
?
Но я не получаю от этого ничего особенного ...
В основном я не понимаю, о чем идет речь в этой статье, может ли кто-нибудь объяснить это более подробно?
«Pgrp» - это группа процессов. ps j
перечисляет идентификатор группы процессов (столбец называется PGID
). PGID процесса - это обычно сам процесс или его родительская группа процессов, но его можно произвольно установить с помощью setpgid()
. Группы процессов определяют, какие процессы получают сигналы управления заданиями. Я думаю, что gdb перемещает процесс в свою группу, чтобы избежать получения процессом сигналов управления заданиями, которые могут нарушить контроль gdb над процессом.
Отчет об ошибке касается использования gdb с программой, которая использует sigwait
. sigwait
позволяет процессу получать сигнал незаметно: вместо того, чтобы доставляться процессу обычным образом, сигнал удаляется из ожидающей очереди и sigwait
возвращается. Это в основном полезно для того, чтобы сигнал всегда доставлялся определенному потоку: блокировать сигнал, но поток потребляет его, запустив sigwait
.
Поскольку сигнал фактически не доставляется процессу, ptrace
ничего не видит, и поэтому gdb не уведомляется о том, что процесс злонамеренно принял сигнал.
В отчете об ошибке идет дискуссия о том, нужно ли модифицировать ядро так, чтобы ptrace
что-то видит, когда сигнал расходуется через sigwait
, или должен ли GDB обрабатывать эту ситуацию иначе. Я недостаточно знаю об этом, чтобы принять чью-то сторону.