summaryrefslogtreecommitdiff
path: root/ddms
diff options
context:
space:
mode:
authorChristopher Ferris <cferris@google.com>2014-09-03 16:36:17 -0700
committerChristopher Ferris <cferris@google.com>2014-09-11 13:53:11 -0700
commitd674d973307acffa982cbdebfb9a4788d2cba687 (patch)
tree7f6d0c95bd70efb88d3eef95e49fdcc08488455b /ddms
parentb0b591757875848be191f0e155af9dec08c190a7 (diff)
downloadswt-d674d973307acffa982cbdebfb9a4788d2cba687.tar.gz
Add support for 64 bit native dumps.
Bug: 17319589 Change-Id: I388836777c905bea5efd9e42846f96b19dd751f8
Diffstat (limited to 'ddms')
-rw-r--r--ddms/app/src/main/java/com/android/ddms/PrefsDialog.java2
-rw-r--r--ddms/ddmuilib/src/main/java/com/android/ddmuilib/Addr2Line.java42
-rw-r--r--ddms/ddmuilib/src/main/java/com/android/ddmuilib/DdmUiPreferences.java9
-rw-r--r--ddms/ddmuilib/src/main/java/com/android/ddmuilib/NativeHeapPanel.java2
-rw-r--r--ddms/ddmuilib/src/main/java/com/android/ddmuilib/heap/NativeHeapPanel.java6
-rw-r--r--ddms/ddmuilib/src/main/java/com/android/ddmuilib/heap/NativeSymbolResolverTask.java19
6 files changed, 62 insertions, 18 deletions
diff --git a/ddms/app/src/main/java/com/android/ddms/PrefsDialog.java b/ddms/app/src/main/java/com/android/ddms/PrefsDialog.java
index c39659e..ca1f12a 100644
--- a/ddms/app/src/main/java/com/android/ddms/PrefsDialog.java
+++ b/ddms/app/src/main/java/com/android/ddms/PrefsDialog.java
@@ -168,7 +168,7 @@ public final class PrefsDialog {
String out = System.getenv("ANDROID_PRODUCT_OUT"); //$NON-NLS-1$
DdmUiPreferences.setSymbolsLocation(out + File.separator + "symbols"); //$NON-NLS-1$
DdmUiPreferences.setAddr2LineLocation("arm-linux-androideabi-addr2line"); //$NON-NLS-1$
-
+ DdmUiPreferences.setAddr2LineLocation64("aarch64-linux-android-addr2line");
String traceview = System.getProperty("com.android.ddms.bindir"); //$NON-NLS-1$
if (traceview != null && traceview.length() != 0) {
traceview += File.separator + DdmConstants.FN_TRACEVIEW;
diff --git a/ddms/ddmuilib/src/main/java/com/android/ddmuilib/Addr2Line.java b/ddms/ddmuilib/src/main/java/com/android/ddmuilib/Addr2Line.java
index 10799ec..ed08141 100644
--- a/ddms/ddmuilib/src/main/java/com/android/ddmuilib/Addr2Line.java
+++ b/ddms/ddmuilib/src/main/java/com/android/ddmuilib/Addr2Line.java
@@ -16,6 +16,8 @@
package com.android.ddmuilib;
+import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
import com.android.ddmlib.Log;
import com.android.ddmlib.NativeLibraryMapInfo;
import com.android.ddmlib.NativeStackCallInfo;
@@ -71,6 +73,9 @@ public class Addr2Line {
/** Path to the library */
private NativeLibraryMapInfo mLibrary;
+ /** addr2line command to execute */
+ private String mAddr2LineCmd;
+
/** the command line process */
private Process mProcess;
@@ -106,16 +111,18 @@ public class Addr2Line {
}
/**
- * Returns the instance of a Addr2Line process for the specified library.
+ * Returns the instance of an Addr2Line process for the specified library
+ * and abi.
* <br>The library should be in a format that makes<br>
* <code>$ANDROID_PRODUCT_OUT + "/symbols" + library</code> a valid file.
*
* @param library the library in which to look for addresses.
+ * @param abi indicates which underlying addr2line command to use.
* @return a new Addr2Line object representing a started process, ready to
* be queried for addresses. If any error happened when launching a
* new process, <code>null</code> will be returned.
*/
- public static Addr2Line getProcess(final NativeLibraryMapInfo library) {
+ public static Addr2Line getProcess(@NonNull final NativeLibraryMapInfo library, @Nullable String abi) {
String libName = library.getLibraryName();
// synchronize around the hashmap object
@@ -126,7 +133,7 @@ public class Addr2Line {
// if we don't find one, we create it
if (process == null) {
- process = new Addr2Line(library);
+ process = new Addr2Line(library, abi);
// then we start it
boolean status = process.start();
@@ -148,14 +155,30 @@ public class Addr2Line {
}
/**
- * Construct the object with a library name. The library should be present
+ * Construct the object with a library name and abi. The library should be present
* in the search path as provided by ANDROID_SYMBOLS, ANDROID_OUT/symbols, or in the user
* provided search path.
*
* @param library the library in which to look for address.
+ * @param abi indicates which underlying addr2line command to use.
*/
- private Addr2Line(final NativeLibraryMapInfo library) {
+ private Addr2Line(@NonNull final NativeLibraryMapInfo library, @Nullable String abi) {
mLibrary = library;
+
+ // Set the addr2line command based on the abi.
+ if (abi == null || abi.startsWith("32")) {
+ Log.d("ddm-Addr2Line", "Using 32 bit addr2line command");
+ mAddr2LineCmd = System.getenv("ANDROID_ADDR2LINE");
+ if (mAddr2LineCmd == null) {
+ mAddr2LineCmd = DdmUiPreferences.getAddr2Line();
+ }
+ } else {
+ Log.d("ddm-Addr2Line", "Using 64 bit addr2line command");
+ mAddr2LineCmd = System.getenv("ANDROID_ADDR2LINE64");
+ if (mAddr2LineCmd == null) {
+ mAddr2LineCmd = DdmUiPreferences.getAddr2Line64();
+ }
+ }
}
/**
@@ -197,14 +220,9 @@ public class Addr2Line {
// because this is only called from getProcess() we know we don't need
// to synchronize this code.
- String addr2Line = System.getenv("ANDROID_ADDR2LINE");
- if (addr2Line == null) {
- addr2Line = DdmUiPreferences.getAddr2Line();
- }
-
// build the command line
String[] command = new String[5];
- command[0] = addr2Line;
+ command[0] = mAddr2LineCmd;
command[1] = "-C";
command[2] = "-f";
command[3] = "-e";
@@ -248,7 +266,7 @@ public class Addr2Line {
// log the error
String msg = String.format(
"Error while trying to start %1$s process for library %2$s",
- DdmUiPreferences.getAddr2Line(), mLibrary);
+ mAddr2LineCmd, mLibrary);
Log.e("ddm-Addr2Line", msg);
// drop the process just in case
diff --git a/ddms/ddmuilib/src/main/java/com/android/ddmuilib/DdmUiPreferences.java b/ddms/ddmuilib/src/main/java/com/android/ddmuilib/DdmUiPreferences.java
index db3642b..9a6a4ff 100644
--- a/ddms/ddmuilib/src/main/java/com/android/ddmuilib/DdmUiPreferences.java
+++ b/ddms/ddmuilib/src/main/java/com/android/ddmuilib/DdmUiPreferences.java
@@ -33,6 +33,7 @@ public final class DdmUiPreferences {
private static String sSymbolLocation =""; //$NON-NLS-1$
private static String sAddr2LineLocation =""; //$NON-NLS-1$
+ private static String sAddr2LineLocation64 =""; //$NON-NLS-1$
private static String sTraceviewLocation =""; //$NON-NLS-1$
public static void setStore(IPreferenceStore store) {
@@ -67,6 +68,14 @@ public final class DdmUiPreferences {
sAddr2LineLocation = location;
}
+ public static String getAddr2Line64() {
+ return sAddr2LineLocation64;
+ }
+
+ public static void setAddr2LineLocation64(String location) {
+ sAddr2LineLocation64 = location;
+ }
+
public static String getTraceview() {
return sTraceviewLocation;
}
diff --git a/ddms/ddmuilib/src/main/java/com/android/ddmuilib/NativeHeapPanel.java b/ddms/ddmuilib/src/main/java/com/android/ddmuilib/NativeHeapPanel.java
index 337bff2..7378c1e 100644
--- a/ddms/ddmuilib/src/main/java/com/android/ddmuilib/NativeHeapPanel.java
+++ b/ddms/ddmuilib/src/main/java/com/android/ddmuilib/NativeHeapPanel.java
@@ -315,7 +315,7 @@ public final class NativeHeapPanel extends BaseHeapPanel {
if (library != null) {
- Addr2Line process = Addr2Line.getProcess(library);
+ Addr2Line process = Addr2Line.getProcess(library, mClientData.getAbi());
if (process != null) {
// remove the base of the library address
NativeStackCallInfo info = process.getAddress(addr);
diff --git a/ddms/ddmuilib/src/main/java/com/android/ddmuilib/heap/NativeHeapPanel.java b/ddms/ddmuilib/src/main/java/com/android/ddmuilib/heap/NativeHeapPanel.java
index 6802dcb..23270f8 100644
--- a/ddms/ddmuilib/src/main/java/com/android/ddmuilib/heap/NativeHeapPanel.java
+++ b/ddms/ddmuilib/src/main/java/com/android/ddmuilib/heap/NativeHeapPanel.java
@@ -205,7 +205,8 @@ public class NativeHeapPanel extends BaseHeapPanel {
NativeSymbolResolverTask resolver = new NativeSymbolResolverTask(
nativeAllocations,
client.getClientData().getMappedNativeLibraries(),
- mSymbolSearchPathText.getText());
+ mSymbolSearchPathText.getText(),
+ client.getClientData().getAbi());
try {
d.run(true, true, resolver);
@@ -1106,7 +1107,8 @@ public class NativeHeapPanel extends BaseHeapPanel {
NativeLibraryMapInfo library = getLibraryFor(addr);
if (library != null) {
- Addr2Line process = Addr2Line.getProcess(library);
+ Client c = getCurrentClient();
+ Addr2Line process = Addr2Line.getProcess(library, c.getClientData().getAbi());
if (process != null) {
NativeStackCallInfo info = process.getAddress(addr);
if (info != null) {
diff --git a/ddms/ddmuilib/src/main/java/com/android/ddmuilib/heap/NativeSymbolResolverTask.java b/ddms/ddmuilib/src/main/java/com/android/ddmuilib/heap/NativeSymbolResolverTask.java
index ed265a4..b74a3d0 100644
--- a/ddms/ddmuilib/src/main/java/com/android/ddmuilib/heap/NativeSymbolResolverTask.java
+++ b/ddms/ddmuilib/src/main/java/com/android/ddmuilib/heap/NativeSymbolResolverTask.java
@@ -16,6 +16,8 @@
package com.android.ddmuilib.heap;
+import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
import com.android.ddmlib.NativeAllocationInfo;
import com.android.ddmlib.NativeLibraryMapInfo;
import com.android.ddmlib.NativeStackCallInfo;
@@ -50,11 +52,14 @@ import java.util.TreeSet;
*/
public class NativeSymbolResolverTask implements IRunnableWithProgress {
private static final String ADDR2LINE;
+ private static final String ADDR2LINE64;
private static final String DEFAULT_SYMBOLS_FOLDER;
static {
String addr2lineEnv = System.getenv("ANDROID_ADDR2LINE");
+ String addr2line64Env = System.getenv("ANDROID_ADDR2LINE64");
ADDR2LINE = addr2lineEnv != null ? addr2lineEnv : DdmUiPreferences.getAddr2Line();
+ ADDR2LINE64 = addr2line64Env != null ? addr2line64Env : DdmUiPreferences.getAddr2Line64();
String symbols = System.getenv("ANDROID_SYMBOLS");
DEFAULT_SYMBOLS_FOLDER = symbols != null ? symbols : DdmUiPreferences.getSymbolDirectory();
@@ -83,9 +88,13 @@ public class NativeSymbolResolverTask implements IRunnableWithProgress {
private Set<String> mNotFoundLibraries;
private String mAddr2LineErrorMessage = null;
+ /** The addr2line command to use to resolve addresses. */
+ private String mAddr2LineCmd;
+
public NativeSymbolResolverTask(List<NativeAllocationInfo> callSites,
List<NativeLibraryMapInfo> mappedLibraries,
- String symbolSearchPath) {
+ @NonNull String symbolSearchPath,
+ @Nullable String abi) {
mCallSites = callSites;
mMappedLibraries = mappedLibraries;
mSymbolSearchFolders = new ArrayList<String>();
@@ -98,6 +107,12 @@ public class NativeSymbolResolverTask implements IRunnableWithProgress {
mUnmappedAddresses = new HashSet<Long>();
mAddressResolution = new HashMap<Long, NativeStackCallInfo>();
mNotFoundLibraries = new HashSet<String>();
+
+ if (abi == null || abi.startsWith("32")) {
+ mAddr2LineCmd = ADDR2LINE;
+ } else {
+ mAddr2LineCmd = ADDR2LINE64;
+ }
}
@Override
@@ -163,7 +178,7 @@ public class NativeSymbolResolverTask implements IRunnableWithProgress {
Set<Long> addressesToResolve) {
Process addr2line;
try {
- addr2line = new ProcessBuilder(ADDR2LINE,
+ addr2line = new ProcessBuilder(mAddr2LineCmd,
"-C", // demangle
"-f", // display function names in addition to file:number
"-e", libPath).start();