引自这里。
gdb 将调试的进程放入其自己的 pgrp 中,并将终端设置为该 pgrp。(例如,在 gdb 和正在调试的程序的 PID 上尝试 ps j。)
这是什么意思
ps j 在 gdb 和正在调试的程序的 PID 上
这是什么意思ps j PID
?
但我并没有从中得到什么特别的东西...
基本上我不明白那篇文章在说什么,有人可以更详细地解释一下吗?
答案1
“pgrp” 是进程组.ps j
列出进程组 ID(该列称为PGID
)。进程的 PGID 通常是其本身或其父进程组,但可以使用 任意设置setpgid()
。进程组控制哪些进程接收作业控制信号。我认为 gdb 将进程移动到其自己的组是为了避免让进程接收作业控制信号,从而扰乱 gdb 对进程的控制。
错误报告是关于使用 gdb 和一个使用sigwait
.sigwait
允许进程以不正当的方式接收信号:信号不是以通常的方式传递给进程,而是从待处理队列中移除并sigwait
返回。这主要用于安排信号始终传递给特定线程:阻止信号,但让线程通过运行来使用它sigwait
。
由于信号实际上并未传递给进程,ptrace
看不到任何内容,因此 gdb 不会收到进程已暗中消耗该信号的通知。
错误报告中的争论在于是否应该修改内核,以便ptrace
在信号通过时看到一些东西sigwait
,或者 gdb 是否应该以不同的方式处理这种情况。我对此了解不多,无法选边站。