void VerifyProcTest(pid_t pid, pid_t tid, bool (*ReadyFunc)(Backtrace*), void (*VerifyFunc)(Backtrace*)) { pid_t ptrace_tid; if (tid < 0) { ptrace_tid = pid; } else { ptrace_tid = tid; } uint64_t start = NanoTime(); bool verified = false; do { usleep(US_PER_MSEC); if (ptrace(PTRACE_ATTACH, ptrace_tid, 0, 0) == 0) { // Wait for the process to get to a stopping point. WaitForStop(ptrace_tid); UniquePtr<Backtrace> backtrace(Backtrace::Create(pid, tid)); ASSERT_TRUE(backtrace->Unwind(0)); ASSERT_TRUE(backtrace.get() != NULL); if (ReadyFunc(backtrace.get())) { VerifyFunc(backtrace.get()); verified = true; } ASSERT_TRUE(ptrace(PTRACE_DETACH, ptrace_tid, 0, 0) == 0); } // If 5 seconds have passed, then we are done. } while (!verified && (NanoTime() - start) <= 5 * NS_PER_SEC); ASSERT_TRUE(verified); }
void VerifyProcTest(pid_t pid, pid_t tid, bool (*ReadyFunc)(const backtrace_t*), void (*VerifyFunc)(const backtrace_t*)) { pid_t ptrace_tid; if (tid < 0) { ptrace_tid = pid; } else { ptrace_tid = tid; } uint64_t start = NanoTime(); bool verified = false; do { usleep(US_PER_MSEC); if (ptrace(PTRACE_ATTACH, ptrace_tid, 0, 0) == 0) { // Wait for the process to get to a stopping point. WaitForStop(ptrace_tid); backtrace_context_t context; ASSERT_TRUE(backtrace_create_context(&context, pid, tid, 0)); if (ReadyFunc(context.backtrace)) { VerifyFunc(context.backtrace); verified = true; } backtrace_destroy_context(&context); ASSERT_TRUE(ptrace(PTRACE_DETACH, ptrace_tid, 0, 0) == 0); } // If 5 seconds have passed, then we are done. } while (!verified && (NanoTime() - start) <= 5 * NS_PER_SEC); ASSERT_TRUE(verified); }
void VerifyThreadTest(pid_t tid, void (*VerifyFunc)(Backtrace*)) { UniquePtr<Backtrace> backtrace(Backtrace::Create(getpid(), tid)); ASSERT_TRUE(backtrace.get() != NULL); ASSERT_TRUE(backtrace->Unwind(0)); VerifyFunc(backtrace.get()); }
void VerifyThreadTest(pid_t tid, void (*VerifyFunc)(const backtrace_t*)) { backtrace_context_t context; backtrace_create_context(&context, getpid(), tid, 0); VerifyFunc(context.backtrace); backtrace_destroy_context(&context); }