系統分析---入門(如何確定java應用的入口)
阿新 • • 發佈:2019-02-06
一、場景
小A拿到一個java的開源專案(如eclipse專案),此開源專案可以啟動,並且已經拿到了該專案的原始碼,小A想對這個開源專案進行一次系統的學習。
二、問題:
這時候,小A遇到了一個問題,如何確定該專案的入口?
三、技巧:JPS與jstack應用
如果是一般的web應用還好說,我們可以不關心應用的入口,但現在是eclipse,所以能確定其程式的主入口對於分析該程式很有幫助。
那麼如何確定其入口呢。由於此專案是java專案,我們都知道java程式的入口方法是main方法。可以以此作為突破口,從執行緒棧中找到main對應的執行緒,不就找到該程式的入口了嗎。
四、實踐
1、JPS確定該程序的 ID號
首先啟動該程式(eclipse),然後使用jps確定該程序的ID:
C:\Users\Administrator>JPS
4232
2、使用jstack匯出執行緒的棧資訊
C:\Users\Administrator>jstack 4232 > threadDump.log
3、檢視threadDump.log
"main" prio=6 tid=0x020a9800 nid=0xdb4 runnable [0x0012f000] java.lang.Thread.State: RUNNABLE at org.eclipse.swt.internal.win32.OS.WaitMessage(Native Method) at org.eclipse.swt.widgets.Display.sleep(Display.java:4652) at org.eclipse.ui.application.WorkbenchAdvisor.eventLoopIdle(WorkbenchAdvisor.java:364) at org.eclipse.ui.internal.ide.application.IDEWorkbenchAdvisor.eventLoopIdle(IDEWorkbenchAdvisor.java:917) at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2702) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499) at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
找到main執行緒,注意最後一句
at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
由此可以確定eclipse的程式入口,好了,開始你的eclipse原始碼之旅吧