ptrace(PTRACE_ATTACH, ...)プログラムの実行中に、、などを使用してプログラムをトレースしようとしていptrace(PTRACE_SINGLESTEP, ...)ます。
すべて問題ないようですが、でトレースプログラムを終了すると、トレースプログラムからCTRL-C(で)デタッチしたいPTRACE_DETACHのですが、このアクションを実行すると、トレースプログラムがエラーでクラッシュしますTrace/BPT trap (core dumped)。
私の質問は、トレースされたプログラムをクラッシュさせずに適切にデタッチするにはどうすればよいですか?
SIGINT信号をキャッチしている関数は次のとおりです。
void sig_int()
{
if (ptrace(PTRACE_DETACH, pid, NULL, NULL) == -1)
my_perror("ptrace / DETACH", strerror(errno));
}
編集:
他のコードは次のとおりです。
if ((ptrace(PTRACE_SINGLESTEP, pid, NULL, NULL) == -1))
my_perror("ptrace / SINGLESTEP", strerror(errno));
if (wait4(pid, &(l->status), 0, 0) == -1)
my_perror("wait4", strerror(errno));
if (ptrace(PTRACE_GETREGS, pid, 0, &(l->reg)) == -1)
my_perror("ptrace / GETREGS", strerror(errno));
if ((l->opcode = ptrace(PTRACE_PEEKTEXT, pid, l->reg.rip, NULL)) == -1)
my_perror("ptrace / PEEKTEXT", strerror(errno));
これは、トレースの最初の部分を実行するループの一部です。