отладка openJDK9 с помощью lldb , не может войти в метод JLI_Launch - PullRequest
0 голосов
/ 18 февраля 2019

Недавно я получил исходный код 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.Надеюсь, кто-нибудь может помочь!

1 Ответ

0 голосов
/ 22 февраля 2019

Вы уверены, что имеете отладочную информацию для функции JLI_Launch?

Вы можете сказать это, выполнив:

(lldb) image lookup -vn JLI_Launch

Если у вас есть отладочная информация для этой функции, то на выходе этой команды будут показаны записи для CompileUnit и LineEntry.Если эти записи отсутствуют, то по крайней мере эта функция была создана без отладочной информации.

Если у вас есть предварительно собранный openJDK, неудивительно, что в нем нет отладочной информации.Иногда у предварительно собранных двоичных файлов есть сторонний пакет с отладочной информацией?Но даже в этом случае предварительно созданные двоичные файлы обычно создаются с оптимизацией, и если вы на самом деле пытаетесь пройтись по библиотеке, чтобы понять ее, вы будете более довольны версией, созданной без оптимизации.Намного сложнее понять поток кода с оптимизированным двоичным кодом.

Если вы создаете свою собственную версию, вам нужно выяснить, как получить сборку для генерации отладочной информации.Я никогда не создавал эту библиотеку, поэтому не могу помочь с этим, но, вероятно, кто-то из списков рассылки openJDK будет знать.

Обратите внимание, что по умолчанию lldb всегда переходит через функции, которые не имеют отладочной информации,Но если вы передадите флаг «-a 0» команде step, он обратит это значение по умолчанию:

(lldb) step -a 0

Но если вы действительно хотите понять, как работает код, вам захочется получить рукив отладочной сборке.

...