首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Java的main方法是如何被调用的

OpenJDK版本 ➜ jdk hg id 76072a077ee1+ jdk-11+28 当我们运行Java命令后,Java程序本身的main方法会首先被执行 C文件src/java.base/share...ret : rslt; } } 该方法最终会调用ContinueInNewThread0方法,开启一个系统线程,且该线程的入口函数是JavaMain。...看下JavaMain方法 C文件src/java.base/share/native/libjli/java.c int JNICALL JavaMain(void * _args) { ......该方法就是我们的最终方法,它会先调用InitializeJVM初始化JVM,再通过一系列的方法获取mainClass、mainArgs,最终调用(*env)->CallStaticVoidMethod 方法真正的执行我们提供的...有关(*env)->CallStaticVoidMethod究竟是如何执行的Java main方法,以及Java main方法又是如何调用的其他Java方法,我们之后会另起文章详细分析。

1.2K30

修改,编译,GDB调试openjdk8源码(docker环境下)

也在此传给子线程,子线程创建成功后,会先执行JavaMain(也就是continuation参数) if (pthread_create(&tid, &attr, (void *(*)(void...,然后这个注释出现了,告诉我“如果因为某些原因(例如内存溢出)导致创建线程失败,当前线程还会继续执行JavaMain,但是在后续的操作中依然有可能发生错误,例如JNI_CreateJavaVM函数会创建一些新的线程...,因此,在当前线程执行JavaMain只是做一次尝试”。...至次,本次阅读,修改,调试和编译openjdk8的实践就结束了,其实JavaMain函数做了很多事情,这次只是看到其中打印信息的那一部分而已,后面的加载class,执行java类等都还没有看到,有兴趣的读者可以先对...java的类加载做个初步了解,再继续阅读JavaMain函数,相信您会有更多收获的。

1.7K90

没想到进入main函数前,发生了这么多事!

先来回顾一下那篇文章,对于C/C++程序而言,从创建进程到进入main函数,主要就是经历了四个阶段: 进程 & 主线程创建阶段 主线程启动执行并进行进程级初始化操作(如加载系统动态链接库) 主线程进入可执行文件的入口...咱们就从这个可执行文件入手,以Linux系统上的Java8版本为例,用反汇编神器IDA打开可以看到,这个可执行文件的入口: image.png 和咱们在上一篇分析的流程符合,进入这个程序启动入口后,...来看传给它的第一个参数,这是新线程启动后将要执行的入口函数:JavaMain。...JavaMain 这个函数的名字就有点意思了,看起来,快要进入Java的地界儿了,加油继续看下去: int JNICALL JavaMain(void * _args) { // ......// ... // 调用它 (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs); // ... } JavaMain

78430

Java离Linux内核有多远?

pthread_join(tid, &tmp); rslt = (int)(intptr_t)tmp; } else { rslt = JavaMain...ThreadJavaMain 直接调用了 JavaMain,所以这里的逻辑就是,如果创建线程成功,就由新线程执行 JavaMain,否则就知道在当前进程执行JavaMain。...JavaMain 是我们关注的重点,核心逻辑如下: int JavaMain(void* _args) { JavaMainArgs *args = (JavaMainArgs *)_args;...其次,fork 返回了两次,clone 也是一样,但它们都是返回到系统调用后开始执行,pthread_create 如何让新线程执行 start_routine 的?...截止到此处,所有的代码都是当前进程执行的,新线程并没有执行。 从第 7 步开始的代码,当前进程和新线程都会执行。对当前进程而言,程序将它第 3 步入栈的寄存器出栈。

1.5K10

RCE命令执行代码执行

使用遗漏函数 ---- rce RCE英文全称:remote command/code execute 分为远程命令执行ping和远程代码执行evel。 漏洞出现的原因:没有在输入口做输入处理。...危险等级:高 shell_exec() 功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。...> 三.利用环境变量LD_PRELOAD来绕过php disable_function执行系统命令 php的mail函数在执行过程中会默认调用系统程序/usr/sbin/sendmail,如果我们能劫持...具体实现如下 1.编制我们自己的动态链接程序,代码如下(功能是执行mkdir test) 执行编译为一个动态共享库的命令如下 gcc -c -fPIC a.c -o a gcc -shared a -o...使用windows 系统组件com (1)phpinfo 中 com.allow_dcom 开启 什么是com 组件: COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成

1.9K10

Python - 执行顺序、执行入口

Python 是如何执行的?执行顺序是怎么样? 至上而下,逐行执行 #!...什么是 Python 脚本的执行入口 类比:进入一栋大楼肯定有个大门入口,赛车要进入赛道也一定有一个入口 所以,执行程序,也需要一个入口 一般称代码执行的入口叫做主函数(main 函数) 执行入口(主函数...假设运行的是 xiaoming.py,那么就会执行主函数 假设运行的是 xiaohong.py,即使 xiaohong 导入了 xiaoming,也不会执行 xiaoming.py 里面的主函数(main...函数) 是否一定需要执行入口(主函数) 不一定 假设没有主函数,那么运行 xiaoming.py 时,就会至上而下,逐行运行 xiaoming.py 的所有代码 执行入口的意义 将业务代码写在主函数上面...,主函数用来调用有业务代码,代码结构整洁 向 Java、C、Golang 看齐,他们都是要求一个程序必须有一个主执行入口才能正确运行

1.8K40

调试HotSpot源代码(配视频)

/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test 进入GDB后,输入如下命令: break java.c:JavaMain continue...第一条命令表示在源文件java.c的JavaMain函数入口处设置断点;第二条命令表示让中断的程序继续运行,直到运行完程序后退出GDB,并在终端打印”Hello World!...查看当前栈帧局部变量的值 list(l) 列出源代码,接着上次的位置往下列,每次列10行ll list(l) 行号 列出从指定行开始的源代码 list(l) 函数名 列出指定的函数的源代码 next(n) 执行下一行语句...print(p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数 quit(q) 退出gdb调试环境 step(s) 执行下一行语句,如果有函数调用则进入到函数中 start 开始执行程序,停在

1.3K40

ABAP 前台执行和后台执行

前言 ABAP程序有2种执行方法  一个前台执行  另一个是后台运行。 后者,所谓后台执行就是在某一个时间段,程序自动运行,俗称位 JOB。...本次将讲解讨论:1.前台执行和后台执行的区别, 2.后台执行的方式,和后台debug的方法。 ---- 一、前台执行和后台执行的不同之处? 前台:通过画面来操作,称之位前台执行。...后台:不通过画面操作的处理,称之位后台执行。 总结:就是执行方式不一样,执行的内容都是一样的。(一个能看到画面,一个看不到画面)。...二、后台执行 后台执行因为不会设计到画面,所以会节省很多资源,但是在执行的之后需要给执行的程序事先事先设置好参数(variant) 1.后台执行的优势 与前台执行相比优势有2点。...1.1 规划性,后台执行可以选择 任意的时间段去执行,就行闹铃一样,只要你设定好了之后就可以定时执行

24510
领券