debug jdk source non può vedere la variabile di cosa si tratta

Sto eseguendo il debug della sorgente JDK come:

public static int codePointAt(CharSequence seq, int index) { char c1 = seq.charAt(index++); if (isHighSurrogate(c1)) { if (index < seq.length()) { char c2 = seq.charAt(index); if (isLowSurrogate(c2)) { return toCodePoint(c1, c2); } } } return c1; } 

e voglio vedere la variabile c1 prima di entrare if (isHighSurrogate(c1)) . Tuttavia, quando eseguo il debug, guardo la variabile c1 e visualizza:

inserisci la descrizione dell'immagine qui

Ho davvero provato l’aggiunta di sorgente rt.jar, ed è davvero ansible entrare nel breakpoint del sorgente JDK, come: inserisci la descrizione dell'immagine qui

ma perché la variabile c1 non può essere visualizzata?

In generale, per essere in grado di osservare le variabili mentre si passa attraverso il codice sorgente JDK, è necessario compilare i file di class con le informazioni di debug, ad esempio compilare utilizzando javac -g .

Quindi la soluzione migliore è trovare una versione già compilata con informazioni di debug (non ho trovato nulla per JDK 7) o provare a compilare il codice sorgente per conto tuo.

Secondo questo post (si noti che non l’ho provato) non è necessario compilare tutte le fonti, solo quelle di cui si ha bisogno. Mettendo le tue classi appena compilate nella directory $jdk/jre/lib/ ext / endorsed , verrebbero utilizzate le nuove classi invece del rt.jar originale.

Credo che dovrebbe iniziare.

Aggiornamento: In realtà ho appena provato questo processo e non è affatto difficile. Testato su Windows, JDK 1.7.0_11. Tutti i comandi sono richiamati dalla riga di comando:

  1. Crea la tua cartella di lavoro. Ho scelto d:\ cartella principale
  2. All’interno della cartella di lavoro crea la cartella sorgente, ad es. jdk7_src e la cartella di output jdk_debug
  3. Dalla tua cartella JDK_HOME src.zip file src.zip e decomprimilo all’interno di jdk7_src
  4. Seleziona cosa compilerai ed elimina il resto. Per tutti loro potresti aver bisogno di ulteriori passaggi. Ho scelto le cartelle:
    • java
    • javax
    • org
  5. Dal tuo JDK_HOME\jre\lib prendi il file rt.jar e inserisci la cartella di lavoro (questo è solo per comodità per non specificare nomi di file troppo grandi nella riga di comando).
  6. Esegui il comando: dir /B /S /X jdk7_src\*.java > filelist.txt per creare un file chiamato filelist.txt con l’elenco di tutti i file java che verranno compilati. Questo sarà dato come input per javac
  7. Esegui javac usando il comando:
    javac -J-Xms16m -J-Xmx1024m -sourcepath d:\jdk7_src -cp d:\rt.jar -dd:\jdk_debug -g @filelist.txt >> log.txt 2>&1 Questo compilerà tutti i file nel jdk_debug e genererà un file log.txt nella cartella di lavoro. Controlla il contenuto del registro. Dovresti ricevere un sacco di avvertenze ma nessun errore.
  8. Vai nella cartella jdk_debug ed esegui il comando: jar cf0 rt_debug.jar * . Questo genererà la tua nuova libreria di runtime con informazioni di degug.
  9. Copia il nuovo jar nella cartella JDK_HOME\jre\lib\endorsed . Se la cartella endorsed non esiste, crearla.

Esegui il debug del tuo programma in Eclipse. Si noti come le variabili vengono denominate normalmente (non più arg0, arg1 ecc.). Debug felice 🙂

Debug di JDK

La soluzione jre \ lib \ endorsed di cs è ottima. È più semplice creare con Eclipse: creare un progetto Java, inserire javax *, java * in src e lasciare compilare Eclipse. Quindi esportare il barattolo.

Questo articolo http://www.thejavageek.com/2016/04/03/debug-jdk-source-code/ descrive lo stesso, ma in modo semplice e piacevole. Fai cose (compilare, creare barattoli) usando solo eclipse.

Solo per quello che sai, il meccanismo di override approvato è deprecato e verrà rimosso in una versione futura ( http://docs.oracle.com/javase/8/docs/technotes/guides/standards/ ).

Usa questo pom.xml per ottenere sorgenti JDK 1.8.0_111 con informazioni di debug:

  4.0.0 JDK sources with debug information ex.jdk.debug jdk-debug-sources 1.8.0_111  UTF-8    com.oracle jdk-rt 1.8.0_111      org.apache.maven.plugins maven-compiler-plugin 3.6.0  true lines,vars,source 1.8 1.8  com/sun/java/swing/** com/sun/source/util/**       

Dovrai eseguire un’installazione manuale del file rt.jar originale per poter eseguire mvn clean install

 mvn install:install-file -Dfile=rt.jar -DgroupId=com.oracle -DartifactId=jdk-rt -Dversion=1.8.0_111 -Dpackaging=jar 

Il file rt.jar ho copiato nella directory endorsed è l’originale rt.jar ma con le classi originali sostituite dalle mie classi appena generate.

Nel caso qualcuno abbia bisogno di questo con Tomcat . È necessario impostare l’argomento VM Djava.endorsed.dirs e inserire il jar jdk compilato in esso. È ansible eseguire la soluzione di cs o esportarla con eclipse (tutte le Java Compiler ClassFile Generation utilizzate da de debugger devono essere attive)

Vai a Esegui configurazioni> Argomenti> Argomenti VM

Djava.endorsed.dirs = “/ la vostra / cartella / apache-tomcat-xxx / approvato”