#include #include #include #include void do_work_level_5(void) { // Frame 0 will have these variables. int frame0_var = 100; const char *frame0_string = "frame_zero"; float frame0_float = 1.5f; // This is where we'll set the breakpoint. printf("Level 5 work executing\n"); // Break here. while (1) sleep(1); } void do_work_level_4(void) { // Frame 1 will have these variables. int frame1_var = 200; const char *frame1_string = "frame_one"; long frame1_long = 9876543210L; do_work_level_5(); } void do_work_level_3(void) { // Frame 2 will have these variables. int test_variable = 42; const char *test_string = "test_value"; double test_double = 3.14159; do_work_level_4(); } void do_work_level_2(void) { do_work_level_3(); } void do_work_level_1(void *context) { do_work_level_2(); } int main(int argc, const char *argv[]) { // Create a serial dispatch queue. dispatch_queue_t worker_queue = dispatch_queue_create("com.test.worker_queue", DISPATCH_QUEUE_SERIAL); dispatch_queue_t submitter_queue = dispatch_queue_create("com.test.submitter_queue", DISPATCH_QUEUE_SERIAL); // Submit work from one queue to another to create extended backtrace. dispatch_async_f(submitter_queue, &worker_queue, do_work_level_1); // Keep main thread alive. dispatch_main(); return 0; }