Add MD_OS_ANDROID definition.

In order to better distinguish Android and Linux minidumps, introduce
a new MD_OS_ANDROID definition, and modify related source code accordingly.

Also append the build-fingerprint to the minidump location descriptor.
This gives more information about the system image the device runs on.
Review URL: https://breakpad.appspot.com/405002

git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@981 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
digit@chromium.org 2012-07-04 11:56:26 +00:00
parent 7db2fb7b93
commit 8d96707553
5 changed files with 38 additions and 1 deletions

View File

@ -53,6 +53,9 @@
#include <link.h> #include <link.h>
#endif #endif
#include <stdio.h> #include <stdio.h>
#if defined(__ANDROID__)
#include <sys/system_properties.h>
#endif
#if !defined(__ANDROID__) #if !defined(__ANDROID__)
#include <sys/ucontext.h> #include <sys/ucontext.h>
#include <sys/user.h> #include <sys/user.h>
@ -1246,7 +1249,11 @@ class MinidumpWriter {
} }
bool WriteOSInformation(MDRawSystemInfo* sys_info) { bool WriteOSInformation(MDRawSystemInfo* sys_info) {
#if defined(__ANDROID__)
sys_info->platform_id = MD_OS_ANDROID;
#else
sys_info->platform_id = MD_OS_LINUX; sys_info->platform_id = MD_OS_LINUX;
#endif
struct utsname uts; struct utsname uts;
if (uname(&uts)) if (uname(&uts))
@ -1283,6 +1290,23 @@ class MinidumpWriter {
space_left -= info_len; space_left -= info_len;
} }
#ifdef __ANDROID__
// On Android, try to get the build fingerprint and append it.
// Fail gracefully because there is no guarantee that the system
// property will always be available or accessible.
char fingerprint[PROP_VALUE_MAX];
int fingerprint_len = __system_property_get("ro.build.fingerprint",
fingerprint);
// System property values shall always be zero-terminated.
// Be paranoid and don't trust the system.
if (fingerprint_len > 0 && fingerprint_len < PROP_VALUE_MAX) {
const char* separator = " ";
if (!first_item)
strlcat(buf, separator, buf_len);
strlcat(buf, fingerprint, buf_len);
}
#endif
MDLocationDescriptor location; MDLocationDescriptor location;
if (!minidump_writer_.WriteString(buf, 0, &location)) if (!minidump_writer_.WriteString(buf, 0, &location))
return false; return false;

View File

@ -611,7 +611,8 @@ typedef enum {
MD_OS_MAC_OS_X = 0x8101, /* Mac OS X/Darwin */ MD_OS_MAC_OS_X = 0x8101, /* Mac OS X/Darwin */
MD_OS_IOS = 0x8102, /* iOS */ MD_OS_IOS = 0x8102, /* iOS */
MD_OS_LINUX = 0x8201, /* Linux */ MD_OS_LINUX = 0x8201, /* Linux */
MD_OS_SOLARIS = 0x8202 /* Solaris */ MD_OS_SOLARIS = 0x8202, /* Solaris */
MD_OS_ANDROID = 0x8203 /* Android */
} MDOSPlatform; } MDOSPlatform;

View File

@ -79,6 +79,7 @@ Exploitability *Exploitability::ExploitabilityForPlatform(
case MD_OS_LINUX: case MD_OS_LINUX:
case MD_OS_UNIX: case MD_OS_UNIX:
case MD_OS_SOLARIS: case MD_OS_SOLARIS:
case MD_OS_ANDROID:
default: { default: {
platform_exploitability = NULL; platform_exploitability = NULL;
break; break;

View File

@ -1760,6 +1760,7 @@ string MinidumpModule::code_identifier() const {
case MD_OS_MAC_OS_X: case MD_OS_MAC_OS_X:
case MD_OS_IOS: case MD_OS_IOS:
case MD_OS_SOLARIS: case MD_OS_SOLARIS:
case MD_OS_ANDROID:
case MD_OS_LINUX: { case MD_OS_LINUX: {
// TODO(mmentovai): support uuid extension if present, otherwise fall // TODO(mmentovai): support uuid extension if present, otherwise fall
// back to version (from LC_ID_DYLIB?), otherwise fall back to something // back to version (from LC_ID_DYLIB?), otherwise fall back to something
@ -3108,6 +3109,10 @@ string MinidumpSystemInfo::GetOS() {
os = "solaris"; os = "solaris";
break; break;
case MD_OS_ANDROID:
os = "android";
break;
default: default:
BPLOG(ERROR) << "MinidumpSystemInfo unknown OS for platform " << BPLOG(ERROR) << "MinidumpSystemInfo unknown OS for platform " <<
HexString(system_info_.platform_id); HexString(system_info_.platform_id);

View File

@ -401,6 +401,11 @@ bool MinidumpProcessor::GetOSInfo(Minidump *dump, SystemInfo *info) {
break; break;
} }
case MD_OS_ANDROID: {
info->os = "Android";
break;
}
default: { default: {
// Assign the numeric platform ID into the OS string. // Assign the numeric platform ID into the OS string.
char os_string[11]; char os_string[11];
@ -838,6 +843,7 @@ string MinidumpProcessor::GetCrashReason(Minidump *dump, u_int64_t *address) {
break; break;
} }
case MD_OS_ANDROID:
case MD_OS_LINUX: { case MD_OS_LINUX: {
switch (exception_code) { switch (exception_code) {
case MD_EXCEPTION_CODE_LIN_SIGHUP: case MD_EXCEPTION_CODE_LIN_SIGHUP: