java - modificar - variables de entorno linux
la fuente jdk de depuraciĆ³n no puede ver la variable de quĆ© se trata (5)
En caso de que alguien necesite esto con Tomcat . Debe configurar el argumento VM Djava.endorsed.dirs y colocar el jdk jar compilado en él. Puede hacer esta solución de cs o exportar con eclipse (toda la generación de compilador de clase de compilador Java utilizada por de depurador debe estar activa)
Vaya a Ejecutar Configuraciones> Argumentos> Argumentos de VM
Djava.endorsed.dirs = "/ your / folder / apache-tomcat-xxx / endorsed"
Estoy depurando la fuente JDK como:
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;
}
y quiero ver c1
variable antes de entrar en if (isHighSurrogate(c1))
. Sin embargo, cuando depuro ver c1
variable, muestra:
Realmente he intentado agregar fuente rt.jar, y realmente puede entrar en el punto de corte de la fuente JDK, como:
pero ¿por qué la variable c1
no puede mostrarse?
En términos generales, para poder ver las variables al pasar por el código fuente de JDK, necesita que los archivos de clase se compilen con información de depuración, es decir compilar usando javac -g
.
Entonces, lo mejor es encontrar una versión ya compilada con información de depuración (no pude encontrar nada para JDK 7) o puedes intentar compilar la fuente por ti mismo.
De acuerdo con esta publicación (tenga en cuenta que no lo he probado), no necesita compilar todas las fuentes, solo las que necesita. Colocando las clases recién compiladas en el $jdk/jre/lib/
ext / $jdk/jre/lib/
, las nuevas clases se usarían en su lugar las del original rt.jar
.
Creo que eso debería hacerte comenzar.
Actualización: en realidad acabo de probar este proceso y no es nada difícil. Probado en Windows, JDK 1.7.0_11. Todos los comandos se invocan desde la línea de comandos:
- Crea tu carpeta de trabajo. Elegí la carpeta
d:/
root - Dentro de su carpeta de trabajo, cree la carpeta de origen, es decir,
jdk7_src
y la carpeta de salidajdk_debug
- Desde su carpeta
JDK_HOME
obtenga el archivosrc.zip
y descomprímalo dentro dejdk7_src
- Seleccione lo que compilará y elimine el resto. Para todos ellos puede necesitar pasos adicionales. He elegido las carpetas:
-
java
-
javax
-
org
-
- Desde su
JDK_HOME/jre/lib
obtenga el archivort.jar
yrt.jar
en la carpeta de trabajo (esto es solo por conveniencia para no especificar nombres de archivo demasiado grandes en la línea de comando). - Ejecute el comando:
dir /B /S /X jdk7_src/*.java > filelist.txt
para crear un archivo llamadofilelist.txt
con la lista de todos los archivos java que se compilarán. Esto se dará como entrada ajavac
- Ejecute
javac
usando el comando:
javac -J-Xms16m -J-Xmx1024m -sourcepath d:/jdk7_src -cp d:/rt.jar -dd:/jdk_debug -g @filelist.txt >> log.txt 2>&1
Esto compilará todos los archivos en eljdk_debug
y generará un archivolog.txt
en su carpeta de trabajo. Verifique el contenido del registro. Deberías recibir un montón de advertencias pero ningún error. -
jdk_debug
carpetajdk_debug
y ejecute el comando:jar cf0 rt_debug.jar *
. Esto generará su nueva biblioteca de tiempo de ejecución con información degug. - Copie ese nuevo jar a la carpeta
JDK_HOME/jre/lib/endorsed
. Si la carpetaendorsed
no existe, créela.
Depure su programa en Eclipse. Observe cómo las variables se nombran normalmente (no más arg0, arg1, etc.). Feliz depuración :)
Este artículo http://www.thejavageek.com/2016/04/03/debug-jdk-source-code/ describe lo mismo pero de una manera simple y agradable. Usted hace cosas (compilar, hacer jar) usando solo eclipse.
La solución cs jre / lib / endorsed es genial. Más fácil de construir es con Eclipse: crea un proyecto Java, coloca javax *, java * en src y deja que Eclipse compile. Luego exporta el jar.
Para que lo sepa, el mecanismo de anulación endosada está en desuso y se eliminará en una versión futura ( http://docs.oracle.com/javase/8/docs/technotes/guides/standards/ ).
Utilice este pom.xml
para obtener fuentes JDK 1.8.0_111
con información de depuración:
<project>
<modelVersion>4.0.0</modelVersion>
<name>JDK sources with debug information</name>
<groupId>ex.jdk.debug</groupId>
<artifactId>jdk-debug-sources</artifactId>
<version>1.8.0_111</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>jdk-rt</artifactId>
<version>1.8.0_111</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<debug>true</debug>
<debuglevel>lines,vars,source</debuglevel>
<source>1.8</source>
<target>1.8</target>
<excludes>
<exclude>com/sun/java/swing/**</exclude>
<exclude>com/sun/source/util/**</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
Tendrás que hacer una instalación manual del rt.jar
original para poder ejecutar mvn clean install
mvn install:install-file -Dfile=rt.jar -DgroupId=com.oracle -DartifactId=jdk-rt -Dversion=1.8.0_111 -Dpackaging=jar
El rt.jar
que copié en el directorio endorsed
es el rt.jar
original pero con las clases originales reemplazadas por las clases que rt.jar
generar.