2014-02-14 15 views
11

Kürzlich konvertiert zu Intellij. Eclipse verfügt über eine Funktion im Debugger, "Primitive Anzeigeoptionen", die Debugger-Grundelemente in Hex- und Ascii-Werten anzeigt.Datentyp Renderer in Intellij?

Eclipse Debugger

Da alles bisher eine Brise in IntelliJ gewesen, ich dachte das ein Klacks sein würde, aber nach einer Stunde und eine Reihe von nicht-funktionalem Datentyp macht später, finde ich mich bereit, Crawl zurück zur Sonnenfinsternis. Ich habe ein paar Renderer gemacht, die funktionierten, aber nur für Objekte, daher kann ich nur folgern, dass Renderer anscheinend nicht für Primitive arbeiten. Kann mir hier jemand in die richtige Richtung zeigen?

Bearbeiten: Ich habe die Option gesehen, Hex in der Standard-Render zu wählen, aber ich hoffe auf etwas mehr als eine Lösung, die 2 Klicks für jede Variable erfordert.

+0

Hmm zur Verfügung. Dies ist ein interessantes Feature der IDE, das ich nicht kannte oder verwenden wollte, bis ich Ihre Frage entdeckte. Ich schaue mir das an, um zu sehen, was es bieten kann. Obwohl, um ehrlich zu sein, die Standardansicht im Debugger für einen primitiven Wert wirklich die beste ist, die ich dort gesehen habe, sogar nach dem Vergleich mit Eclipse und Netbeans. – Makoto

+0

Danke! Es ist von unschätzbarem Wert für einige der Dateiformat-Umkehrung, und ByteBuffer Typ Arbeit, die ich mache. In Eclipse kann ich ein Byte-Array oder einen zugrundeliegenden ByteBuffer untersuchen und sofort Ascii oder Byte-Muster in Daten sehen, die gelesen oder geschrieben werden. Es macht fast den Wechsel zu Intellij für mich zu einem Nichtstarter. – Kyle

+0

Das gleiche für mich, ich brauche diese Funktionalität für Low-Level-Debugging. Ich habe auch stundenlang mit IntelliJ Custom Renderern getüftelt. :-( – winne2

Antwort

8

Für ganzzahlige Werte (also weder Fließkommawerte noch boolesche Werte) können Sie sie als hexadezimalen Wert anzeigen, indem Sie mit der rechten Maustaste auf das Grundelement im Debugger klicken und "Anzeigen als" -> "Hex" auswählen .

enter image description here

Standardmäßig verfügt der Datentyp Renderer funktioniert nur mit Objekten, und der einzig realistische Weg ein primitiven darzustellen, ist entweder als Integralwert oder in hex, so denke ich, das ein glücklicher Kompromiss.

+6

Ich hätte erwähnen sollen, dass ich auch dieses Feature gefunden habe, aber ich würde es hassen, es jedes Mal wechseln zu müssen, wenn ich den Hex-Wert sehen möchte. Ich hatte sogar gehofft, etwas als Standard zu finden, aber scheiterte – Kyle

+2

So sehr ich es auch nicht mag, scheint das manuelle Umschalten dieser Funktion die einzige Möglichkeit zu sein, dies zu erreichen – Kyle

16

Meine Lösung bestand darin, einen benutzerdefinierten Datentypen-Renderer bereitzustellen, der den folgenden Ausdruck für byte[]: new String(Hex.encode(this)); verwendet.

Dies funktioniert standardmäßig, solange der Datentypen-Renderer aktiviert ist (der Status bleibt bei Neustarts von Anwendungen erhalten). Sie können kompliziertere String-Formatierung hinzufügen, wenn Sie möchten (ich habe normalerweise eine Dienstprogrammklasse, die weitere Formatierungen durchführt, und ich rufe sie einfach aus dem DTR-Ausdrucksfeld auf).

Data Type Renderer

Debugger view

+2

Dies ist eine nahe Lösung, aber es ist immer noch peinlich (meistens unbrauchbar für lange Arrays) – Kyle

+0

Welche Bibliothek ist Hex-Klasse aus? nicht in rt.jar –

+0

in diesem Fall finden Könnte es war wahrscheinlich eine benutzerdefinierte Klasse, die ich geschrieben hatte, aber jeder der Hex-Konverter Klassen von commons-Codec oder BouncyCastle arbeiten als Solange sie auf dem Klassenpfad sind – Andy

1

Diese Andy Lösung ähnlich ist, aber Sie nicht die Hex Klasse definieren erfordern (die er selbst nicht erwähnt). Funktioniert nur für Java8-Projekte (also nicht für Android).

Sie haben einen benutzerdefinierten Datentyp-Renderer, um die folgenden Ausdruck für byte[] (siehe Andy's answer):

IntStream.range(0,Math.min((this.length+3)/4,20)).mapToObj(i->IntStream.range(i*4,Math.min(i*4+4,_this.length)).mapToObj(i1->String.format("%02x",_this[i1])).collect(Collectors.joining())).collect(Collectors.joining(" "))+(this.length>80?"...":"") 

Es werden die Daten formatiert werden, so dass „01.020.304 05.060.708 09“, dh von vier gruppiert und getrennt durch Leerzeichen. Nur die ersten 80 Bytes werden angezeigt, wenn mehr vorhanden sind, werden Auslassungspunkte hinzugefügt.

+1

Die Hex-Klasse, auf die er sich bezieht, ist wahrscheinlich die von Shiro oder eines der Apache-Commons-Projekte, was viele Projekte bereits auf dem Klassenpfad haben. Diese – David

+0

nicht für mich arbeiten: Kann nicht Ausdruck Lambdas Auswertung bewerten ist nicht – Aaron

1

Sie können permanent alle Primitiven ändern in der Variablen-Explorer in den anpassen Datenansichten Optionen in hex angezeigt werden (dort ist es eine Checkbox) enter image description here

3

ich ein paar Renderer gemacht, die, nur aber arbeitete für Objekte, so kann ich nur schlussfolgern, dass Renderer nicht für Primitive funktionieren.

Mit IDEA 2.016,3 ist es endlich möglich, benutzerdefinierte Java-Datentyp Renderers für primitive Typen (einschließlich Arrays) zu definieren.

https://www.jetbrains.com/idea/whatsnew/#v2016-3

+1

unterstützt Verwendung der Java-Datentyp Renderers für primitive Typen, konnte ich diesen Ausdruck verwenden, um beide Dezimal und Hexadezimal-Werte für alle ints anzuzeigen: diese + " ["+ String.format (" 0x% 08x ", this) +"] " – caitoo0o

-1

Sie können auch DeltaHex Editor plugin für IntelliJ basierte IDEs versuchen, das Fenster mit typischen hex + Text-Vorschau für Byte-Array in Debugger zeigen kann.

DeltaHex Editor Plugin Debug Byte Array Image

Plugin ist in Einstellungen/Plugins/durchsuchen Repositories/Suche nach DeltaHex

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/19062398) – pushkin

+0

pushkin: Hinzugefügt Methode, wie Plugin installiert wird. Aber ich glaube, dass Antwort bereits vorher beschreibend war. Vielleicht haben Sie den Text der Antwort nicht bemerkt, bevor der Link zum Bild durch Bild ersetzt wurde? – HajdaM