Javaw.exe – Konsolenfenster erscheint zufälligJava

Java-Forum
Anonymous
 Javaw.exe – Konsolenfenster erscheint zufällig

Post by Anonymous »

Ich habe eine grafische JavaFX-Anwendung, die mithilfe von Javaw.exe einen sekundären untergeordneten Prozess startet. Javaw.exe wurde ausgewählt, weil ich nicht möchte, dass ein Konsolenfenster sichtbar ist. Nach kurzer Zeit erzeugt der Unterprozess spontan ein leeres Konsolenfenster.
Hier ist ein Screenshot der Situation, in der es auftritt. Ich weiß, um welchen Prozess es sich handelt. Der Prozess läuft mit PID 10972.
Image

Ich habe noch nie zuvor eine javaw.exe-Konsole gesehen, daher weiß ich nicht einmal, wo ich anfangen soll, nach der möglichen Ursache zu suchen.
Im Moment habe ich eher einen Verdacht Nativer Code führt dazu, dass das Konsolenfenster angezeigt wird. Diese App lädt tatsächlich einige RTI-DDS-DLLs und führt über diese DLLs eine RTI-Aufzeichnungsdienstinstanz aus. Da dies mein Verdacht ist, suche ich nach Vorschlägen für einige Dinge, die überprüft werden sollten. Ich weiß wirklich nicht, wo ich anfangen soll zu suchen.
Ich habe versucht, diese App mit java.exe auszuführen, um zu sehen, ob es eine seltsame Konsolenausgabe gibt, die von nativem Code stammen könnte, die mir nicht bekannt ist, aber ich habe keine gesehen.
Dies ist seit einiger Zeit ein chronisches Problem für mein Softwarepaket und ich suche nur nach einer Richtung. Hat jemand so etwas schon einmal gesehen?
Hier ist ein Foto des Prozessbaums, der das problematische Konsolenfenster unter der javaw.exe-App zeigt.
Image

Unten ist der Code, den ich zum Starten des Kindes verwende javaw.exe-Prozess. In diesem Szenario ist die Protokollierung deaktiviert und daher wird swallowProcessOutput ausgeführt. Es ist erwähnenswert, dass ich 4 weitere Unterprozesse habe, die auf die gleiche Weise aufgerufen werden, bei denen die Protokollierung deaktiviert ist und bei denen nie ein javaw.exe-Konsolenfenster angezeigt wird.
Sie fragen sich vielleicht, warum ich Ausgabe für einen javaw.exe-Prozess verbrauche, der eigentlich keine haben sollte, und ich habe derzeit keine wirklich gute Antwort darauf. Ich weiß nur, dass ich Probleme mit hängengebliebenen Unterprozessen hatte, wenn ich vor einigen Jahren während der Entwicklung nicht die Konsolenausgabe genutzt habe. Ich vermute ohnehin nicht, dass dies die Ursache für das Erscheinen des Konsolenfensters ist, aber ich dachte, es sollte erwähnt werden.
Ich suche eigentlich nur nach einer Anleitung, wie ich das Problem beheben kann. Alle Vorschläge wären hilfreich, um herauszufinden, was die Ursache sein könnte, sei es Debugging-Tools von Drittanbietern, Windows-Tricks oder was auch immer.
Systeminformationen

Code: Select all

Microsoft Windows 10 Enterprise 10.0.17763
openjdk version "19.0.36" x86

Code: Select all

/**
* Executes the command that will launch this server application.  This method will start a new instance of the
* server application each time it is called.
*/
public void launch()
{
Map envMap = new HashMap();
environment.variables.forEach(eVar -> envMap.put(eVar.varName, eVar.varValue));
final File workingDir = new File(workingDirectory);
if ((!workingDir.exists() || !workingDir.isDirectory()) && !workingDir.mkdirs())
{
LOG.error("Unable to create working directory for app {}", this);
}
launcher = new ProcessBuilder(command.commandArguments).directory(workingDir);
launcher.environment().putAll(envMap);

try
{
if (!command.commandArguments.isEmpty())
{
LOG.info("Launching server app {} with command {}", getName(), String.join(" ", command.commandArguments));
Process launchedAppProcess = launcher.start();

if (logging.enabled)
{
LOG.info("Output will be logged for server application {}", getName());
final String threadName = getName().contains(".") ? getName().split("\\.")[0] : getName();
Utils.logProcessOutput(launchedAppProcess, LogManager.getLogger("com.company.logging." + threadName), logging.lineExclusions);
}
else
{
LOG.info("Output will not be logged for server application {}", getName());
Utils.swallowProcessOutput(launchedAppProcess); /* We need to read the output or else the app may hang if using javaw.exe */
}
}
else
{
LOG.warn("Command not found for server app {}. App was not launched.", getName());
}
}
catch (Exception e)
{
LOG.error("Error launching server app {}", name, e);
}
finally
{
try
{
LOG.info("Pausing for {} milliseconds before launching the next server app", postLaunchPauseMS);
Thread.sleep(postLaunchPauseMS);
}
catch (InterruptedException e)
{
LOG.warn("Post launch pause of app {} was interrupted", name);
Thread.currentThread().interrupt();
}
}
}

/**
* Reads a given process's output and does nothing with it
*
* @param p process to swallow output
*/
public static void swallowProcessOutput(Process p)
{
ScheduledExecutorService loggerService = Executors.newScheduledThreadPool(2, DAEMON_THREAD_FACTORY);

loggerService.schedule(() ->
{
try (Scanner sc = new Scanner(p.getInputStream()))
{
while (!p.isAlive())
{
//noinspection BusyWait
Thread.sleep(250);
}
while (sc.hasNextLine() && p.isAlive())
{
sc.nextLine(); /* Do nothing */
}
}
catch (InterruptedException i)
{
Thread.currentThread().interrupt();
}
catch (Exception e)
{
LOG.catching(e);
}
}, 0, TimeUnit.MILLISECONDS);

loggerService.schedule(() ->
{
try (Scanner sc = new Scanner(p.getErrorStream()))
{
while (!p.isAlive())
{
//noinspection BusyWait
Thread.sleep(250);
}
while (sc.hasNextLine() && p.isAlive())
{
sc.nextLine(); /* Do nothing */
}
}
catch (InterruptedException i)
{
Thread.currentThread().interrupt();
}
catch (Exception e)
{
LOG.catching(e);
}
}, 0, TimeUnit.MILLISECONDS);
}
Ich habe versucht, die App mit javaw.exe zu starten, aber das Konsolenfenster erscheint nach einer unbestimmten Zeitspanne.
Ich habe versucht, die App mit java.exe zu starten, um zu sehen, ob eine Konsolenausgabe vom nativen Code kam, aber es konnte keine zusätzliche Ausgabe identifiziert werden. Wenn ich absichtlich eine Konsole erzeuge, ist es nahezu unmöglich zu wissen, wann das Problem auftritt, da das Problem selbst das Konsolenfenster ist.
Ich gehe davon aus, dass bei der Verwendung von Javaw.exe nie ein Konsolenfenster angezeigt wird.
Bearbeiten 1:
Ich habe versucht, mit procmon nach Aufrufen von AllocConsole zu suchen, wie von Botje vorgeschlagen, aber es wurden keine Ergebnisse erzielt, selbst nachdem die Konsole angezeigt wurde.
Image

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post