Merge "Output correct gdbserver instructions from debuggerd."
This commit is contained in:
commit
9cb0b5719c
1 changed files with 34 additions and 14 deletions
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue