diff --git a/java/debugger/impl/src/com/intellij/debugger/memory/agent/MemoryAgentUtil.java b/java/debugger/impl/src/com/intellij/debugger/memory/agent/MemoryAgentUtil.java index 91ad620ff616..d1e7cb71b9c9 100644 --- a/java/debugger/impl/src/com/intellij/debugger/memory/agent/MemoryAgentUtil.java +++ b/java/debugger/impl/src/com/intellij/debugger/memory/agent/MemoryAgentUtil.java @@ -37,6 +37,7 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.Bitness; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.containers.ContainerUtil; @@ -60,6 +61,7 @@ import java.util.jar.Attributes; public class MemoryAgentUtil { private static final Logger LOG = Logger.getInstance(MemoryAgentUtil.class); + private static final String MEMORY_AGENT_EXTRACT_DIRECTORY = "memory.agent.extract.dir"; private static final Key LISTEN_MEMORY_AGENT_STARTUP_FAILED = Key.create("LISTEN_MEMORY_AGENT_STARTUP_FAILED"); private static final int ESTIMATE_OBJECTS_SIZE_LIMIT = 2000; @@ -101,7 +103,9 @@ public class MemoryAgentUtil { } LOG.info("Memory agent extracting took " + (System.currentTimeMillis() - start) + " ms"); - String path = JavaExecutionUtil.handleSpacesInAgentPath(agentFile.getAbsolutePath(), "debugger-memory-agent", null); + String agentFileName = agentFile.getName(); + String path = JavaExecutionUtil.handleSpacesInAgentPath(agentFile.getAbsolutePath(), "debugger-memory-agent", + MEMORY_AGENT_EXTRACT_DIRECTORY, f -> agentFileName.equals(f.getName())); if (path == null) { LOG.error("Could not use memory agent file. Spaces are found."); return; @@ -198,7 +202,8 @@ public class MemoryAgentUtil { } } - return ApplicationManager.getApplication().executeOnPooledThread(() -> new AgentExtractor().extract(detectAgentKind(jdkPath))) + return ApplicationManager.getApplication() + .executeOnPooledThread(() -> new AgentExtractor().extract(detectAgentKind(jdkPath), getAgentDirectory())) .get(1, TimeUnit.SECONDS); } @@ -214,6 +219,22 @@ public class MemoryAgentUtil { return Bitness.x32.equals(versionInfo.bitness) ? AgentExtractor.AgentLibraryType.WINDOWS32 : AgentExtractor.AgentLibraryType.WINDOWS64; } + @NotNull + private static File getAgentDirectory() { + String agentDirectory = System.getProperty(MEMORY_AGENT_EXTRACT_DIRECTORY); + if (agentDirectory != null) { + File file = new File(agentDirectory); + if (file.exists() || file.mkdirs()) { + return file; + } + + LOG.info("Directory specified in property \"" + MEMORY_AGENT_EXTRACT_DIRECTORY + + "\" not found. Default tmp directory will be used"); + } + + return new File(FileUtil.getTempDirectory()); + } + private static void listenIfStartupFailed() { Project project = JavaDebuggerSupport.getContextProjectForEditorFieldsInDebuggerConfigurables(); if (project == null || Boolean.TRUE.equals(project.getUserData(LISTEN_MEMORY_AGENT_STARTUP_FAILED))) return; diff --git a/java/debugger/memory-agent/src/com/intellij/debugger/memory/agent/extractor/AgentExtractor.kt b/java/debugger/memory-agent/src/com/intellij/debugger/memory/agent/extractor/AgentExtractor.kt index ede69940c2ba..2ebcd4e8124b 100644 --- a/java/debugger/memory-agent/src/com/intellij/debugger/memory/agent/extractor/AgentExtractor.kt +++ b/java/debugger/memory-agent/src/com/intellij/debugger/memory/agent/extractor/AgentExtractor.kt @@ -7,8 +7,8 @@ import java.io.File import java.io.FileNotFoundException class AgentExtractor { - fun extract(agentType: AgentLibraryType): File { - val file = FileUtil.createTempFile("${agentType.prefix}memory_agent", agentType.suffix, true) + fun extract(agentType: AgentLibraryType, directory: File): File { + val file = FileUtil.createTempFile(directory, "${agentType.prefix}memory_agent", agentType.suffix, true) val agentFileName = "${agentType.prefix}memory_agent${agentType.suffix}" val inputStream = AgentExtractor::class.java.classLoader.getResourceAsStream("bin/$agentFileName") if (inputStream == null) throw FileNotFoundException(agentFileName)