Plan 9のprivateプロセスはデバッガでアタッチできない
This content is a draft and will not be included in production builds.
auth/factotumなど、機密情報を扱うプロセスはprivateでありnoswapになっている。
privateプロセスへの変更は、/proc/(pid)/ctlにprivateと書けばプライベートとなり、他のプロセスから保護される。また、noswapと書けばスワップの対象にならない。この処理はカーネルの /sys/src/9/port/devproc.c で実装される。
/* 重要なところだけ抜粋 */voidprocctlreq(Proc *p, char *va, int n){ cb = parsecmd(va, n); ct = lookupcmd(cb, proccmd, nelem(proccmd)); switch(ct->index){ case CMnoswap: p->noswap = 1; break; case CMprivate: p->privatemem = 1; break; }このとき、acidでデバッグしたり、killしようとしても、保護されているので
mem: permission denied
となってアタッチできない。この処理は上記と同じファイルのprocopenで実装されている。
static Chan*procopen(Chan *c, int omode){ switch(QID(c->qid)){ case Qnote: if(p->privatemem) error(Eperm); break; case Qmem: case Qctl: if(p->privatemem) error(Eperm); nonone(p); break; }auth/factotumに-p(または-d)フラグを与えるとprivateにもnoswapにもならないので、デバッグしたい場合はフラグを与えるといい。
ソースコードはこのあたり。