Merge "Output correct gdbserver instructions from debuggerd."

This commit is contained in:
Elliott Hughes 2014-05-17 03:34:38 +00:00 committed by Gerrit Code Review
commit 9cb0b5719c

View file

@ -92,20 +92,43 @@ static void disable_debug_led() {
} }
static void wait_for_user_action(pid_t pid) { static void wait_for_user_action(pid_t pid) {
// First log a helpful message // Find out the name of the process that crashed.
char path[64];
snprintf(path, sizeof(path), "/proc/%d/exe", pid);
char exe[PATH_MAX];
int count;
if ((count = readlink(path, exe, sizeof(exe) - 1)) == -1) {
LOG("readlink('%s') failed: %s", path, strerror(errno));
strlcpy(exe, "unknown", sizeof(exe));
} else {
exe[count] = '\0';
}
// Turn "/system/bin/app_process" into "app_process".
// gdbserver doesn't cope with full paths (though we should fix that
// and remove this).
char* name = strrchr(exe, '/');
if (name == NULL) {
name = exe; // No '/' found.
} else {
++name; // Skip the '/'.
}
// Explain how to attach the debugger.
LOG( "********************************************************\n" LOG( "********************************************************\n"
"* Process %d has been suspended while crashing. To\n" "* Process %d has been suspended while crashing.\n"
"* attach gdbserver for a gdb connection on port 5039\n" "* To attach gdbserver for a gdb connection on port 5039\n"
"* and start gdbclient:\n" "* and start gdbclient:\n"
"*\n" "*\n"
"* gdbclient app_process :5039 %d\n" "* gdbclient %s :5039 %d\n"
"*\n" "*\n"
"* Wait for gdb to start, then press HOME or VOLUME DOWN key\n" "* Wait for gdb to start, then press the VOLUME DOWN key\n"
"* to let the process continue crashing.\n" "* to let the process continue crashing.\n"
"********************************************************\n", "********************************************************\n",
pid, pid); pid, name, pid);
// wait for HOME or VOLUME DOWN key // Wait for VOLUME DOWN.
if (init_getevent() == 0) { if (init_getevent() == 0) {
int ms = 1200 / 10; int ms = 1200 / 10;
int dit = 1; int dit = 1;
@ -118,17 +141,14 @@ static void wait_for_user_action(pid_t pid) {
}; };
size_t s = 0; size_t s = 0;
input_event e; input_event e;
bool done = false;
init_debug_led(); init_debug_led();
enable_debug_led(); enable_debug_led();
do { while (true) {
int timeout = abs(codes[s]) * ms; int timeout = abs(codes[s]) * ms;
int res = get_event(&e, timeout); int res = get_event(&e, timeout);
if (res == 0) { if (res == 0) {
if (e.type == EV_KEY if (e.type == EV_KEY && e.code == KEY_VOLUMEDOWN && e.value == 0) {
&& (e.code == KEY_HOME || e.code == KEY_VOLUMEDOWN) break;
&& e.value == 0) {
done = true;
} }
} else if (res == 1) { } else if (res == 1) {
if (++s >= sizeof(codes)/sizeof(*codes)) if (++s >= sizeof(codes)/sizeof(*codes))
@ -139,7 +159,7 @@ static void wait_for_user_action(pid_t pid) {
disable_debug_led(); disable_debug_led();
} }
} }
} while (!done); }
uninit_getevent(); uninit_getevent();
} }