PTRACE_POKEUSER失败,错误代码为3
我使用这个POC代码来附加100个线程,这些线程是从单个进程创建的。一些线程也在创建新线程。在这里我观察到:PTRACE_ATTACH是成功的。但当我打电话给PTRACE_POKEUSER时,我发现错误ESRCH Process not found。任何想法,PTRCE_ATTACH是通过的,但是为什么PTRACE_POKEUSER失败了呢PTRACE_POKEUSER失败,错误代码为3,c,linux,multithreading,gdb,ptrace,C,Linux,Multithreading,Gdb,Ptrace,我使用这个POC代码来附加100个线程,这些线程是从单个进程创建的。一些线程也在创建新线程。在这里我观察到:PTRACE_ATTACH是成功的。但当我打电话给PTRACE_POKEUSER时,我发现错误ESRCH Process not found。任何想法,PTRCE_ATTACH是通过的,但是为什么PTRACE_POKEUSER失败了呢 {EDIT}使代码最小化:无需使用代码,我的qus更具理论性TL;博士请做一份报告。或者至少将代码显示范围缩小到最小的相关部分。如果目标未停止,则可以返回E
{EDIT}使代码最小化:无需使用代码,我的qus更具理论性TL;博士请做一份报告。或者至少将代码显示范围缩小到最小的相关部分。如果目标未停止,则可以返回ESRCH。PTRACE_ATTACH不一定会立即停止目标线程。手册页建议使用waitpid等待它停止;if-1==w printfMKH:waitpid失败…错误=%d\n,错误号;但问题仍然存在,waitpid失败,错误代码为:找不到10个子进程,令人惊讶的是,我添加了usleep100 afetr ptrace_attach,它成功了。注意:我的问题更复杂,我正试图在一个大型项目中添加一个调试器,它在开始时需要100多个线程,我必须附加所有线程。
static inline int set_hw_br(pid_t tracee, dr7_t *pdr7, void *addr, int dr_index)
{
errno = 0;
printf("LINE = %d <pid> %d, dr_index= %d\n",__LINE__, tracee, dr_index);
if (ptrace(PTRACE_POKEUSER, tracee, offsetof(struct user, u_debugreg[dr_index]), addr))
{
printf("22 errno = %d\n", errno);
return -1;
}
if (ptrace(PTRACE_POKEUSER, tracee, offsetof(struct user, u_debugreg[7]), *pdr7))
{
printf("33 errno = %d\n", errno);
return -1;
}
}
void tracer_actions(void *tracked_add, fn_ptr debug_handler)
//void tracer_actions()
{
int status = 0;
int signal_catch_cnt = 0;
int exit_cnt = 0;
int sig_cnt = 0;
int stop_cnt = 0;
int trap_stop_cnt = 0;
int cnt = 0;
int *pNum = tracked_add;
int trap_cnt= 0;
pid_t child_waited = -1;
if(g_arg_params.debugee_tid)
{
if(-1L == ptrace(PTRACE_ATTACH, g_arg_params.debugee_tid, NULL))
{
printf("MKH_ATTACH-FAIL err =%s debugee<tid> %d debuger <tid>%d\n",
strerror(errno), g_arg_params.debugee_tid,
g_arg_params.debuger_tid);
return ;
}
else
printf("Ptrace attached passed...\n");
/*
if(ptrace(PTRACE_SETOPTIONS, g_arg_params.debugee_tid, NULL, ptraceOption))
{
printf("Error, ptrace(PTRACE_SETOPTIONS, failed with %d\n", errno);
}
*/
/* DRs modification through ptrace and ptarce detach the child */
dr7_t dr7 = {0};
dr7.l0 = 1;
dr7.rw0 = DR7_BREAK_ON_WRITE;
dr7.len0 = DR7_LEN_4;
set_hw_br(g_arg_params.debugee_tid, &dr7, &g_var_x, 0);
/* Continue the tracee thread */
if (ptrace(PTRACE_CONT, g_arg_params.debugee_tid, NULL, NULL))
{
printf("44\n");
}
}
}