Недавно я получил исходный код openJDK9 и успешно скомпилировал в режиме slowDebug.Вот результат скомпилированный каталог
Я отлаживаю Java запуска лаунчера с lldb, вот команда.
cd /Users/chenyongda/Desktop/openjdk/openJDK9/YourOpenJDK/build/macosx-x86_64-normal-serverANDclient-slowdebug/jdk/bin
lldb ./java
, и тогда, это работает!Вот результат.
lldb-точка останова
Это круто!Однако в этом файле c с именем main.c я могу только перешагнуть через код.Если я хочу перейти к конкретному коду, например, JLI_Launch , он будет повторяться все время
Связанный код, который я перечислил ниже main.c
int
main(int argc, char **argv)
{
int margc;
char** margv;
const jboolean const_javaw = JNI_FALSE;
#endif /* JAVAW */
JLI_InitArgProcessing(!HAS_JAVA_ARGS, const_disable_argfile);
#ifdef _WIN32
{
int i = 0;
if (getenv(JLDEBUG_ENV_ENTRY) != NULL) {
printf("Windows original main args:\n");
for (i = 0 ; i < __argc ; i++) {
printf("wwwd_args[%d] = %s\n", i, __argv[i]);
}
}
}
JLI_CmdToArgs(GetCommandLine());
margc = JLI_GetStdArgc();
// add one more to mark the end
margv = (char **)JLI_MemAlloc((margc + 1) * (sizeof(char *)));
{
int i = 0;
StdArg *stdargs = JLI_GetStdArgs();
for (i = 0 ; i < margc ; i++) {
margv[i] = stdargs[i].arg;
}
margv[i] = NULL;
}
#else /* *NIXES */
{
// accommodate the NULL at the end
JLI_List args = JLI_List_new(argc + 1);
int i = 0;
// Add first arg, which is the app name
JLI_List_add(args, JLI_StringDup(argv[0]));
// Append JDK_JAVA_OPTIONS
if (JLI_AddArgsFromEnvVar(args, JDK_JAVA_OPTIONS)) {
// JLI_SetTraceLauncher is not called yet
// Show _JAVA_OPTIONS content along with JDK_JAVA_OPTIONS to aid diagnosis
if (getenv(JLDEBUG_ENV_ENTRY)) {
char *tmp = getenv("_JAVA_OPTIONS");
if (NULL != tmp) {
JLI_ReportMessage(ARG_INFO_ENVVAR, "_JAVA_OPTIONS", tmp);
}
}
}
// Iterate the rest of command line
for (i = 1; i < argc; i++) {
JLI_List argsInFile = JLI_PreprocessArg(argv[i]);
if (NULL == argsInFile) {
JLI_List_add(args, JLI_StringDup(argv[i]));
} else {
int cnt, idx;
cnt = argsInFile->size;
for (idx = 0; idx < cnt; idx++) {
JLI_List_add(args, argsInFile->elements[idx]);
}
// Shallow free, we reuse the string to avoid copy
JLI_MemFree(argsInFile->elements);
JLI_MemFree(argsInFile);
}
}
margc = args->size;
// add the NULL pointer at argv[argc]
JLI_List_add(args, NULL);
margv = args->elements;
}
#endif /* WIN32 */
return JLI_Launch(margc, margv,
sizeof(const_jargs) / sizeof(char *), const_jargs,
0, NULL,
VERSION_STRING,
DOT_VERSION,
(const_progname != NULL) ? const_progname : *margv,
(const_launcher != NULL) ? const_launcher : *margv,
HAS_JAVA_ARGS,
const_cpwildcard, const_javaw, 0);
}
иследующий фрагмент находится в java.c
int
JLI_Launch(int argc, char ** argv, /* main argc, argc */
int jargc, const char** jargv, /* java args */
int appclassc, const char** appclassv, /* app classpath */
const char* fullversion, /* full version defined */
const char* dotversion, /* UNUSED dot version
defined */
const char* pname, /* program name */
const char* lname, /* launcher name */
jboolean javaargs, /* JAVA_ARGS */
jboolean cpwildcard, /* classpath wildcard*/
jboolean javaw, /* windows-only javaw */
jint ergo /* unused */
)
{
int mode = LM_UNKNOWN;
char *what = NULL;
char *main_class = NULL;
int ret;
Мне нравится openJdk, и я действительно хочу глубоко отладить, чтобы узнать подробности о том, как работает java.Надеюсь, кто-нибудь может помочь!