PTRACE_POKEUSER失败,错误代码为3

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

我使用这个POC代码来附加100个线程,这些线程是从单个进程创建的。一些线程也在创建新线程。在这里我观察到:PTRACE_ATTACH是成功的。但当我打电话给PTRACE_POKEUSER时,我发现错误ESRCH Process not found。任何想法,PTRCE_ATTACH是通过的,但是为什么PTRACE_POKEUSER失败了呢


{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");
        }

    }
}