LINUX 3.5.4 PTRACE(シリーズ5)
1539 ワード
リストからcでは、サブプロセスがPTRACEを通過していることがわかります.TRACEMEは、追跡されるプロセスをアクティブに要求するために使用されますが、アクティブに追跡されるプロセスをデバッグするだけでなく、任意のプロセスをアクティブに追跡できる必要があります.次にlist 2を使います.c希薄PTRACEを分析するTRACEMEによるexecシリーズシステム呼び出しの処理
list2.c
child2.c
実行結果は次のとおりです.
次に、プログラムの出力を分析します.
サブプロセスがPTRACE_を呼び出すとTRACEMEの場合、サブプロセスのプロアクティブな申請が追跡されていることを示します.その後、サブプロセスは実行され続け、execシステム呼び出しが実行されると、カーネルはサブプロセスにSIGTRAPを送信します.親プロセスのwaitが起動し、対応する情報が出力されます.サブプロセスの現在のステータス(Trace/breakpoint trap)が含まれます.
その後、親プロセスが3秒間スリープし、PTRACE_を呼び出します.CONTはサブプロセスを起動して実行を継続させる.サブプロセスが対応する情報を印刷します:child start...
ここでは、execの後に続くprintf文が実行されていないことも見られます.execシステム呼び出しを説明すると、サブプロセスは自分のコードセグメントを実行します.
未完待機
list2.c
#include "ptrace.h"
void main()
{
int pid, status;
if((pid=fork())==0){
ptrace(PTRACE_TRACEME,0,0,0);
execl("/root/child2.o","./child2.o",0);
printf("exec failed...
");
}
else{
wait(&status);
if(WIFSTOPPED(status)){
printf("child has stopped!
");
fprintf(stderr,"%s",strsignal(WSTOPSIG(status)));
}
sleep(3);
ptrace(PTRACE_CONT,pid,0,0);
wait(&status);
}
}
child2.c
#include "ptrace.h"
void main()
{
printf("child start...
");
sleep(1);
//while(1)
//printf("hello!
");
}
実行結果は次のとおりです.
次に、プログラムの出力を分析します.
サブプロセスがPTRACE_を呼び出すとTRACEMEの場合、サブプロセスのプロアクティブな申請が追跡されていることを示します.その後、サブプロセスは実行され続け、execシステム呼び出しが実行されると、カーネルはサブプロセスにSIGTRAPを送信します.親プロセスのwaitが起動し、対応する情報が出力されます.サブプロセスの現在のステータス(Trace/breakpoint trap)が含まれます.
その後、親プロセスが3秒間スリープし、PTRACE_を呼び出します.CONTはサブプロセスを起動して実行を継続させる.サブプロセスが対応する情報を印刷します:child start...
ここでは、execの後に続くprintf文が実行されていないことも見られます.execシステム呼び出しを説明すると、サブプロセスは自分のコードセグメントを実行します.
未完待機