static void wait_for_user_action(pid_t pid) { // First log a helpful message LOG( "********************************************************\n" "* Process %d has been suspended while crashing. To\n" "* attach gdbserver for a gdb connection on port 5039\n" "* and start gdbclient:\n" "*\n" "* gdbclient app_process :5039 %d\n" "*\n" "* Wait for gdb to start, then press HOME or VOLUME DOWN key\n" "* to let the process continue crashing.\n" "********************************************************\n", pid, pid); // wait for HOME or VOLUME DOWN key if (init_getevent() == 0) { int ms = 1200 / 10; int dit = 1; int dah = 3*dit; int _ = -dit; int ___ = 3*_; int _______ = 7*_; const int codes[] = { dit,_,dit,_,dit,___,dah,_,dah,_,dah,___,dit,_,dit,_,dit,_______ }; size_t s = 0; input_event e; bool done = false; init_debug_led(); enable_debug_led(); do { int timeout = abs(codes[s]) * ms; int res = get_event(&e, timeout); if (res == 0) { if (e.type == EV_KEY && (e.code == KEY_HOME || e.code == KEY_VOLUMEDOWN) && e.value == 0) { done = true; } } else if (res == 1) { if (++s >= sizeof(codes)/sizeof(*codes)) s = 0; if (codes[s] > 0) { enable_debug_led(); } else { disable_debug_led(); } } } while (!done); uninit_getevent(); } // don't forget to turn debug led off disable_debug_led(); LOG("debuggerd resuming process %d", pid); }
static void wait_for_user_action(unsigned tid, struct ucred* cr) { (void)tid; /* First log a helpful message */ LOG( "********************************************************\n" "* Process %d has been suspended while crashing. To\n" "* attach gdbserver for a gdb connection on port 5039:\n" "*\n" "* adb shell gdbserver :5039 --attach %d &\n" "*\n" "* Press HOME key to let the process continue crashing.\n" "********************************************************\n", cr->pid, cr->pid); /* wait for HOME key (TODO: something useful for devices w/o HOME key) */ if (init_getevent() == 0) { int ms = 1200 / 10; int dit = 1; int dah = 3*dit; int _ = -dit; int ___ = 3*_; int _______ = 7*_; const signed char codes[] = { dit,_,dit,_,dit,___,dah,_,dah,_,dah,___,dit,_,dit,_,dit,_______ }; size_t s = 0; struct input_event e; int home = 0; init_debug_led(); enable_debug_led(); do { int timeout = abs((int)(codes[s])) * ms; int res = get_event(&e, timeout); if (res == 0) { if (e.type==EV_KEY && e.code==KEY_HOME && e.value==0) home = 1; } else if (res == 1) { if (++s >= sizeof(codes)/sizeof(*codes)) s = 0; if (codes[s] > 0) { enable_debug_led(); } else { disable_debug_led(); } } } while (!home); uninit_getevent(); } /* don't forget to turn debug led off */ disable_debug_led(); /* close filedescriptor */ LOG("debuggerd resuming process %d", cr->pid); }
static void wait_for_user_action(unsigned tid, struct ucred* cr) { (void)tid; /* First log a helpful message */ LOG( "********************************************************\n" "* process %d crashed. debuggerd waiting for gdbserver \n" "* \n" "* adb shell gdbserver :port --attach %d & \n" "* \n" "* and press the HOME key. \n" "********************************************************\n", cr->pid, cr->pid); /* wait for HOME key */ if (init_getevent() == 0) { int ms = 1200 / 10; int dit = 1; int dah = 3*dit; int _ = -dit; int ___ = 3*_; int _______ = 7*_; const signed char codes[] = { dit,_,dit,_,dit,___,dah,_,dah,_,dah,___,dit,_,dit,_,dit,_______ }; size_t s = 0; struct input_event e; int home = 0; init_debug_led(); enable_debug_led(); do { int timeout = abs((int)(codes[s])) * ms; int res = get_event(&e, timeout); if (res == 0) { if (e.type==EV_KEY && e.code==KEY_HOME && e.value==0) home = 1; } else if (res == 1) { if (++s >= sizeof(codes)/sizeof(*codes)) s = 0; if (codes[s] > 0) { enable_debug_led(); } else { disable_debug_led(); } } } while (!home); uninit_getevent(); } /* don't forget to turn debug led off */ disable_debug_led(); /* close filedescriptor */ LOG("debuggerd resuming process %d", cr->pid); }