-
Notifications
You must be signed in to change notification settings - Fork 36
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Bug] 构建版在启动器退出时桌宠也异常退出的调查报告 #73
Comments
源码研究经过对openjdk17关于jpackage windows平台源码的详细研究后 ...
const tstring launcherPath = SysInfo::getProcessModulePath();
const tstring appImageRoot = FileUtils::dirname(launcherPath);
const tstring appDirPath = FileUtils::mkpath() << appImageRoot << _T("app");
const AppLauncher appLauncher = AppLauncher().setImageRoot(appImageRoot)
.addJvmLibName(_T("bin\\jli.dll"))
.setAppDir(appDirPath)
.setLibEnvVariableName(_T("PATH"))
.setDefaultRuntimePath(FileUtils::mkpath() << appImageRoot << _T("runtime"));
const bool restart = !appLauncher.libEnvVariableContainsAppDir();
std::unique_ptr<Jvm> jvm(appLauncher.createJvmLauncher());
if (restart) {
...
jobInfo.BasicLimitInformation.LimitFlags =
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE | JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK;
...
}
... 可以发现,控制进程是否被附加 bool AppLauncher::libEnvVariableContainsAppDir() const {
tstring value = SysInfo::getEnvVariable(std::nothrow,
libEnvVarName, tstring());
#ifdef _WIN32
value = tstrings::toLower(value);
#endif
const tstring_array tokens = tstrings::split(value,
tstring(1, FileUtils::pathSeparator));
return tokens.end() != std::find(tokens.begin(), tokens.end(),
#ifdef _WIN32
tstrings::toLower(appDirPath)
#else
appDirPath
#endif
);
} 可以看到,这个函数的功能实际上是判断给定的环境变量 Jvm* AppLauncher::createJvmLauncher() const {
...
if (!libEnvVariableContainsAppDir()) {
(*jvm).addEnvVariable(libEnvVarName, SysInfo::getEnvVariable(
std::nothrow, libEnvVarName)
+ FileUtils::pathSeparator
+ appDirPath);
}
...
} 总结绕过触发工作限制的方法为: 实现因为检查环境变量以及设置工作限制都发生在JVM启动以前,所以无法用JAVA语言自身实现
现在暂时在windows平台下,使用方案一进行验证,效果良好,在 2024.10.19 更新由于JVM本身启动的时候会将 |
#74 采用“在exe安装的时候自动添加环境变量”这一解决方法,确实解决了 EXE 构建版的问题。但是,ZIP 构建版仍会存在此问题。 |
背景
在 @half-nothing 试图为 ArkPets 的构建添加 Actions 时发现,Actions 远端构建的 EXE 存在一个问题:当启动器退出时,由该启动器启动的正在运行的桌宠本体也会一起终止运行(预期表现应该是桌宠本体继续运行)。值得注意的是,我们本地构建的 EXE 没有发生此问题。
与此 Actions 相关的 ArkPets Commit 如下:
83e4f66#diff-5c3fa597431eda03ac3339ae6bf7f05e1a50d6fc7333679ec38e21b337cb6721
调查过程
@half-nothing 于 2024 年 4 月发现,出现问题的 ArkPets 进程被附加了
![kill_on_job_close](https://private-user-images.githubusercontent.com/107977864/360233351-12f0b628-78e0-4d6f-9310-abc16ff74216.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwMDgyOTIsIm5iZiI6MTczOTAwNzk5MiwicGF0aCI6Ii8xMDc5Nzc4NjQvMzYwMjMzMzUxLTEyZjBiNjI4LTc4ZTAtNGQ2Zi05MzEwLWFiYzE2ZmY3NDIxNi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQwOTQ2MzJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jYTJjNDcwYjg3ZGUwYzdlYzQwN2VlOGM4ZTFiOTE0YjQ2NjE1ZjJkZGU0MjQ4ZTEwOWZlN2Y4ZWU5MTEyY2UwJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.K9I5KSSzsFiFff5i_DO8N5qPBXL3TTq2_7JGa9C24ZM)
KILL_ON_JOB_CLOSE
工作限制:@isHarryh 于 2024 年 8 月确认,该问题是由于 JDK 17.0.10 针对 jpackage 的关于 8301247 的修复引起的。与此问题相关的 JDK Commit 如下:
openjdk/jdk17u-dev@179c60f#diff-7ab0168a7e08937033bbddd525ffc98601753348e290579ececf6c0717118c4eR166-R168
解决建议
为了解决这一问题,建议所有构建环境的 JDK 版本不得超过 17.0.9。有条件的话,可以研究可以避免
KILL_ON_JOB_CLOSE
工作限制触发的方法。有关 JDK 的更新日志,参见 Consolidated JDK 17 Release Notes。
The text was updated successfully, but these errors were encountered: