diff --git a/Ghidra/Features/Base/src/main/java/ghidra/GhidraRun.java b/Ghidra/Features/Base/src/main/java/ghidra/GhidraRun.java index 5b7e433b5a..bc9a821f0d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/GhidraRun.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/GhidraRun.java @@ -27,12 +27,10 @@ import ghidra.base.help.GhidraHelpService; import ghidra.framework.Application; import ghidra.framework.GhidraApplicationConfiguration; import ghidra.framework.client.RepositoryAdapter; -import ghidra.framework.data.DomainObjectAdapter; import ghidra.framework.main.FrontEndTool; import ghidra.framework.model.*; import ghidra.framework.project.DefaultProjectManager; import ghidra.framework.store.LockException; -import ghidra.program.database.ProgramDB; import ghidra.util.*; import ghidra.util.exception.UsrException; import ghidra.util.extensions.ExtensionUtils; @@ -90,6 +88,9 @@ public class GhidraRun implements GhidraLaunchable { SystemUtilities.runSwingLater(() -> { String projectPath = processArguments(args); openProject(projectPath); + + log.info("Ghidra starup complete (" + GhidraLauncher.getMillisecondsFromLaunch() + + " ms)"); }); }; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/AnalyzeHeadless.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/AnalyzeHeadless.java index 3db6eade8d..7481abc017 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/AnalyzeHeadless.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/AnalyzeHeadless.java @@ -22,8 +22,7 @@ import java.net.URL; import java.util.*; import generic.stl.Pair; -import ghidra.GhidraApplicationLayout; -import ghidra.GhidraLaunchable; +import ghidra.*; import ghidra.app.util.opinion.Loader; import ghidra.framework.*; import ghidra.framework.model.DomainFolder; @@ -118,6 +117,9 @@ public class AnalyzeHeadless implements GhidraLaunchable { HeadlessOptions options = analyzer.getOptions(); parseOptions(options, args, optionStartIndex, ghidraURL, filesToImport); + Msg.info(AnalyzeHeadless.class, + "Headless startup complete (" + GhidraLauncher.getMillisecondsFromLaunch() + " ms)"); + // Do the headless processing try { if (ghidraURL != null) { diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/classfinder/ClassSearcher.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/classfinder/ClassSearcher.java index 9019034bcb..b7c05cec5e 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/classfinder/ClassSearcher.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/classfinder/ClassSearcher.java @@ -273,8 +273,8 @@ public class ClassSearcher { SystemUtilities.runSwingNow(() -> fireClassListChanged()); - t = (new Date()).getTime() - t; - String finishedMessage = "Class search complete (" + t + " ms)"; + String finishedMessage = "Class search complete (%d ms, %d classes loaded)" + .formatted((new Date()).getTime() - t, extensionPoints.size()); monitor.setMessage(finishedMessage); log.info(finishedMessage); } diff --git a/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraLauncher.java b/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraLauncher.java index e6096766ac..87dc7828a6 100644 --- a/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraLauncher.java +++ b/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraLauncher.java @@ -17,6 +17,8 @@ package ghidra; import java.io.*; import java.lang.reflect.Constructor; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @@ -35,6 +37,8 @@ import utility.module.ModuleUtilities; */ public class GhidraLauncher { + private static Instant START_INSTANT = Instant.now(); + /** * Launches the given {@link GhidraLaunchable} specified in the first command line argument * @@ -46,7 +50,6 @@ public class GhidraLauncher { */ public static void launch(String[] args) throws Exception { - // Initialize the Ghidra environment GhidraApplicationLayout layout = initializeGhidraEnvironment(); // Make sure the thing to launch meets the criteria: @@ -93,6 +96,13 @@ public class GhidraLauncher { launch(args); } + /** + * {@return the current number of milliseconds that have elapsed since execution began} + */ + public static long getMillisecondsFromLaunch() { + return ChronoUnit.MILLIS.between(START_INSTANT, Instant.now()); + } + /** * Initializes the Ghidra environment by discovering its {@link GhidraApplicationLayout layout} * and adding all relevant modules and libraries to the classpath