diff --git a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Objdump.java b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Objdump.java index df22d447fd5..420746360a8 100644 --- a/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Objdump.java +++ b/core/org.eclipse.cdt.core/utils/org/eclipse/cdt/utils/Objdump.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.utils; import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; @@ -45,7 +46,7 @@ public class Objdump { public Objdump(String command, String[] params, String file) throws IOException { init(command, params, file); } - + public Objdump(String file) throws IOException { this("objdump", new String[0], file); //$NON-NLS-1$ } @@ -60,18 +61,54 @@ public class Objdump { } } - public byte[] getOutput() throws IOException { - Process objdump = ProcessFactory.getFactory().exec(args); - StringBuffer buffer = new StringBuffer(); - BufferedReader stdout = new BufferedReader(new InputStreamReader(objdump.getInputStream())); - char[] buf = new char[512]; - int len; - while ((len = stdout.read(buf, 0, buf.length)) != -1) { - buffer.append(buf, 0, len); + @Override + public String toString() { + StringBuilder b = new StringBuilder(); + b.append(args[0]); + for (int i = 1; i < args.length; i++) { + b.append(" "); //$NON-NLS-1$ + b.append(args[i]); } - stdout.close(); - objdump.destroy(); - return buffer.toString().getBytes(); + return b.toString(); + } + /** + * Limit output to number of bytes + */ + public byte[] getOutput(int limitBytes) throws IOException { + Process objdump = ProcessFactory.getFactory().exec(args); + try { + StringBuffer buffer = new StringBuffer(); + BufferedReader stdout = new BufferedReader(new InputStreamReader( + objdump.getInputStream())); + char[] buf = new char[4096]; + int len; + while ((len = stdout.read(buf, 0, buf.length)) != -1) { + if (limitBytes > 0 && buffer.length() + len >= limitBytes) { + buffer.append(buf, 0, Math.min(len, limitBytes - buffer.length())); + break; + } + buffer.append(buf, 0, len); + } + try { + stdout.close(); + } catch (IOException e) { + // ignore that + } + return buffer.toString().getBytes(); + } finally { + objdump.destroy(); + } + } + + public byte[] getOutput() throws IOException { + return getOutput(0); + } + + public InputStream getInputStream() throws IOException { + Process objdump = ProcessFactory.getFactory().exec(args); + objdump.getOutputStream().close(); + objdump.getErrorStream().close(); + return objdump.getInputStream(); } public void dispose() { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.java index 1fb850fee6c..d5800d034f0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.java @@ -61,6 +61,7 @@ public final class CEditorMessages extends NLS { public static String OverrideIndicatorManager_overrides; public static String OverrideIndicatorManager_shadows; public static String OverrideIndicatorManager_via; + public static String DefaultBinaryFileEditor_TruncateMessage; public static String DefaultCEditorTextHover_html_name; public static String DefaultCEditorTextHover_html_prototype; public static String DefaultCEditorTextHover_html_description; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.properties index 062332c0c9a..5c2486c6562 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditorMessages.properties @@ -49,6 +49,7 @@ OverrideIndicatorManager_overrides=Overrides OverrideIndicatorManager_shadows=Shadows OverrideIndicatorManager_via=via +DefaultBinaryFileEditor_TruncateMessage=Truncated, result is too large, use command line objdump DefaultCEditorTextHover_html_name=Name: DefaultCEditorTextHover_html_prototype=
Prototype: DefaultCEditorTextHover_html_description=
Description:
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/DefaultBinaryFileEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/DefaultBinaryFileEditor.java index 8631997337d..5d8bd85238a 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/DefaultBinaryFileEditor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/DefaultBinaryFileEditor.java @@ -119,10 +119,22 @@ public class DefaultBinaryFileEditor extends AbstractTextEditor { if (object != null) { IGnuToolFactory factory= (IGnuToolFactory) object.getBinaryParser().getAdapter(IGnuToolFactory.class); if (factory != null) { - Objdump objdump= factory.getObjdump(object.getPath()); + Objdump objdump = factory.getObjdump(object.getPath()); if (objdump != null) { try { - fStorage= new FileStorage(new ByteArrayInputStream(objdump.getOutput()), object.getPath()); + // limit editor to X MB, if more - users should use objdump in command + // this is UI blocking call, on 56M binary it takes more than 15 min + // and generates at least 2.5G of assembly + int limitBytes = 6 * 1024 * 1024; // this can run reasonably within seconds + byte[] output = objdump.getOutput(limitBytes); + if (output.length >= limitBytes) { + // add a message for user + String text = CEditorMessages.DefaultBinaryFileEditor_TruncateMessage; + String message = "\n\n--- " + text + " ---\n" + objdump.toString(); //$NON-NLS-1$ //$NON-NLS-2$ + System.arraycopy(message.getBytes(), 0, output, + limitBytes - message.length(), message.length()); + } + fStorage = new FileStorage(new ByteArrayInputStream(output), object.getPath()); } catch (IOException exc) { CUIPlugin.log(exc); }