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);
}