diff options
author | Christopher Ferris <cferris@google.com> | 2014-09-03 16:36:17 -0700 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2014-09-11 13:53:11 -0700 |
commit | d674d973307acffa982cbdebfb9a4788d2cba687 (patch) | |
tree | 7f6d0c95bd70efb88d3eef95e49fdcc08488455b /ddms | |
parent | b0b591757875848be191f0e155af9dec08c190a7 (diff) | |
download | swt-d674d973307acffa982cbdebfb9a4788d2cba687.tar.gz |
Add support for 64 bit native dumps.
Bug: 17319589
Change-Id: I388836777c905bea5efd9e42846f96b19dd751f8
Diffstat (limited to 'ddms')
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(); |