void* ThreadMaxRun(void* data) { thread_t* thread = reinterpret_cast<thread_t*>(data); thread->tid = gettid(); EXPECT_NE(test_recursive_call(MAX_BACKTRACE_FRAMES+10, ThreadSetState, data), 0); return NULL; }
int test_recursive_call(int level, void (*callback_func)(void*), void* data) { if (level > 0) { return test_recursive_call(level - 1, callback_func, data) + level; } else if (callback_func != NULL) { callback_func(data); } else { while (1) { } } return 0; }
TEST(libbacktrace, ptrace_max_trace) { pid_t pid; if ((pid = fork()) == 0) { ASSERT_NE(test_recursive_call(MAX_BACKTRACE_FRAMES+10, NULL, NULL), 0); exit(1); } VerifyProcTest(pid, BACKTRACE_CURRENT_THREAD, ReadyMaxBacktrace, VerifyMaxDump); kill(pid, SIGKILL); int status; ASSERT_EQ(waitpid(pid, &status, 0), pid); }
TEST(libbacktrace, thread_current_max) { ASSERT_NE(test_recursive_call(MAX_BACKTRACE_FRAMES+10, VerifyMaxThread, NULL), 0); }
TEST(libbacktrace, local_max_trace) { ASSERT_NE(test_recursive_call(MAX_BACKTRACE_FRAMES+10, VerifyMaxBacktrace, NULL), 0); }