কোন জেভিএম-এ জেআইটি দ্বারা উত্পাদিত নেটিভ কোড দেখার কোনও উপায় আছে কি?
কোন জেভিএম-এ জেআইটি দ্বারা উত্পাদিত নেটিভ কোড দেখার কোনও উপায় আছে কি?
উত্তর:
ধরে নিই যে আপনি সান হটস্পট জেভিএম ব্যবহার করছেন (অর্থাত্ ওরাকল দ্বারা জাভা ডটকমের দেওয়া একটি ), আপনি পতাকাটি যুক্ত করতে পারেন
-এক্সএক্স: + মুদ্রণপোস্টোঅসাধারণ
আপনার কোড চলমান যখন। এটি জেআইটি সংকলক দ্বারা উত্পন্ন অনুকূলিতকরণের কোডটি মুদ্রণ করবে এবং বাকী অংশটি ছাড়বে।
আপনি যদি অব্যক্ত না করা অংশগুলি সহ পুরো বাইটোকোড দেখতে চান তবে অ্যাড করুন
-এক্সএক্স: কমাইল সংক্ষিপ্তকরণ = #
যখন আপনি আপনার কোড চালাচ্ছেন।
আপনি এই কমান্ড এবং সাধারণভাবে জে আই টি JIT কার্যকারিতা সম্বন্ধে আরও পড়তে পারেন এখানে ।
অন্যান্য উত্তর দ্বারা ব্যাখ্যা হিসাবে, আপনি নিম্নলিখিত JVM বিকল্পগুলি দিয়ে চালাতে পারেন:
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
আপনি নিম্নলিখিত সিনট্যাক্স সহ একটি নির্দিষ্ট পদ্ধতিতেও ফিল্টার করতে পারেন:
-XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*MyClass.myMethod
মন্তব্য:
আপনি যদি উইন্ডোজ চালাচ্ছেন তবে এই পৃষ্ঠায় কীভাবে বিল্ড এবং ইনস্টল করবেন hsdis-amd64.dll
এবং hsdis-i386.dll
কোনটি এটির কাজ করা প্রয়োজন তা নির্দেশাবলী রয়েছে । আমরা নীচের অনুলিপি এবং রেফারেন্সের জন্য * পৃষ্ঠার বিষয়বস্তু প্রসারিত:
যেখানে প্রিবিল্ট বাইনারি পাওয়া যায়
আপনি এফসিএমএল প্রকল্প থেকে উইন্ডোজের জন্য প্রিল বিল্ট বাইনারি ডাউনলোড করতে পারেন
কীভাবে উইন্ডোজ বানাবেন hsdis-amd64.dll
এবং কীভাবে করবেনhsdis-i386.dll
গাইডের এই সংস্করণটি উইন্ডোজ 8.1 64 বিটে 64-বিট সাইগউইন ব্যবহার করে এবং hsdis-amd64.dll উত্পাদন করে তৈরি করা হয়েছিল
সাইগউইন ইনস্টল করুন । এ Select Packages
পর্দা, নিম্নলিখিত প্যাকেজ যোগ (সম্প্রসারিত করে Devel
বিভাগ, তারপর একবার ক্লিক Skip
প্রতিটি প্যাকেজ নামের পাশে ট্যাগ):
make
mingw64-x86_64-gcc-core
(শুধুমাত্র জন্য প্রয়োজন hsdis-amd64.dll
)mingw64-i686-gcc-core
(শুধুমাত্র জন্য প্রয়োজন hsdis-i386.dll
)diffutils
( Utils
বিভাগে)সাইগউইন টার্মিনালটি চালান। এটি ইনস্টলার দ্বারা তৈরি ডেস্কটপ বা স্টার্ট মেনু আইকন ব্যবহার করে করা যেতে পারে এবং আপনার সাইগউইন হোম ডিরেক্টরি ( C:\cygwin\home\<username>\
বা C:\cygwin64\home\<username>\
ডিফল্টরূপে) তৈরি করবে ।
binutils-2.25.tar.bz2
। এটির ফলে binutils-2.25
আপনার সাইগউইন হোম ডিরেক্টরিতে নামের ডিরেক্টরি (বা সর্বশেষ সংস্করণ যাই হোক না কেন) পাওয়া উচিত insrc\share\tools
) বের করুন।cd ~/hsdis
।তৈরি করতে hsdis-amd64.dll
, প্রবেশ করান
make OS=Linux MINGW=x86_64-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.25
তৈরি করতে hsdis-i386.dll
, প্রবেশ করান
make OS=Linux MINGW=i686-w64-mingw32 'AR=$(MINGW)-ar' BINUTILS=~/binutils-2.25
উভয় ক্ষেত্রেই, 2.25
আপনি ডাউনলোড করেছেন বাইনুটিल्स সংস্করণটি প্রতিস্থাপন করুন । OS=Linux
প্রয়োজনীয় কারণ, যদিও সাইগউইন একটি লিনাক্স-এর মতো পরিবেশ, এইচএসডি মেকফিল এটিকে এটির মতো চিনতে ব্যর্থ।
./chew: No such file or directory
এবং এর সাথে বিল্ডটি ব্যর্থ হবে gcc: command not found
। সম্পাদনা করুন <Cygwin home directory>\hsdis\build\Linux-amd64\bfd\Makefile
WordPad বা পরিবর্তনের নোটপ্যাড ++, মত একটি টেক্সট এডিটরে SUBDIRS = doc po
(লাইন 342, যদি binutils 2.25 ব্যবহার করে) থেকে SUBDIRS = po
। পূর্ববর্তী কমান্ডটি পুনরায় রান করুন।ডিএলএল এখন থেকে এটা অনুলিপি করে ইনস্টল করা যাবে hsdis\build\Linux-amd64
অথবা hsdis\build\Linux-i586
আপনার JRE এর bin\server
বা bin\client
ডিরেক্টরি। অনুসন্ধানের মাধ্যমে আপনি আপনার সিস্টেমে এ জাতীয় সমস্ত ডিরেক্টরি খুঁজে পেতে পারেন java.dll
।
বোনাস টিপ: আপনি যদি এটিএন্ডটি-তে ইন্টেল এএসএম সিনট্যাক্স পছন্দ করেন তবে আপনি -XX:PrintAssemblyOptions=intel
যে কোনও প্রিন্ট-অ্যাস্পেসব্ল্যাশন বিকল্প ব্যবহার করবেন তার পাশাপাশি নির্দিষ্ট করুন।
* পৃষ্ঠার লাইসেন্স ক্রিয়েটিভ কমন্স
/usr/lib/
আপনার ব্যবহারের জন্য একটি hsdis প্লাগইন প্রয়োজন PrintAssembly
। সুবিধাজনক পছন্দ হ'ল এফসিএমএল লাইব্রেরির উপর ভিত্তি করে এইচএসডি প্লাগইন।
এটি ইউনিক্স-এর মতো সিস্টেমে সংকলন করা যেতে পারে এবং উইন্ডোজে আপনি সোর্সফোরেজে এফসিএমএল ডাউনলোড বিভাগে উপলব্ধ প্রাক-বিল্ট গ্রন্থাগারগুলি ব্যবহার করতে পারেন :
java.dll
(উইন্ডোজ অনুসন্ধান ব্যবহার করুন)। আমার সিস্টেমে, আমি এটি দুটি স্থানে পেয়েছি:
C:\Program Files\Java\jre1.8.0_45\bin\server
C:\Program Files\Java\jdk1.8.0_45\jre\bin\server
cd <source code dir>
./configure && make && sudo make install
cd example/hsdis && make && sudo make install
sudo ln -s /usr/local/lib/libhsdis.so <JDK PATH>/lib/amd64/hsdis-amd64.so
sudo ln -s /usr/local/lib/libhsdis.so <JDK PATH>/jre/lib/amd64/hsdis-amd64.so
/usr/lib/jvm/java-8-oracle
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly
-XX:+LogCompilation -XX:PrintAssemblyOptions=intel,mpad=10,cpad=10,code
-jar fcml-test.jar
অতিরিক্ত কনফিগারেশন পরামিতি:
মেমোনিকের আগে কোড মুদ্রণ মেশিন কোড।
ইন্টেল ইন্টেল সিনট্যাক্স ব্যবহার করুন।
গ্যাস এটিএন্ডটি এসেম্বলারের সিনট্যাক্স (জিএনইউ এসেম্বলারের সাথে সামঞ্জস্যপূর্ণ) ব্যবহার করুন।
dec আইএমএম এবং ডিসপ্লেসমেন্টকে দশমিক মান হিসাবে মুদ্রণ করে।
এমপ্যাড = নির্দেশের স্মৃতিযুক্ত অংশের জন্য এক্সএক্স এক্স প্যাডিং। মেশিন কোডের জন্য
সিপ্যাড = এক্সএক্স প্যাডিং।
seg ডিফল্ট বিভাগ রেজিস্টারগুলি দেখায়।
শূন্যগুলি এইচএক্স লিটারেলের ক্ষেত্রে নেতৃস্থানীয় শূন্যগুলি প্রদর্শন করে।
উইন্ডোজের ক্ষেত্রে ইন্টেল সিনট্যাক্স হ'ল একটি ডিফল্ট, যেখানে এটিএনটিটি জিএনইউ / লিনাক্সের জন্য একটি ডিফল্ট।
আরও তথ্যের জন্য দেখুন এফসিএমএল লাইব্রেরি রেফারেন্স ম্যানুয়াল
apt-get install libhsdis0-fcml
( Askubuntu.com/a/991166/489909 )। এটি নিজের তৈরি করা প্রয়োজন হতে পারে না।
হটস্পট (সান ছিল) জেভিএম-এর জন্য এমনকি পণ্য মোডেও:
http://wikis.oracle.com/display/HotSpotInternals/ মুদ্রণ অপ্রয়োজনীয়
কিছু সমাবেশ প্রয়োজন: এটি একটি প্লাগইন প্রয়োজন।
আমি বিশ্বাস করি যে আপনি উইন্ডোজ মেশিনে চালনা করলে উইনডিবিজি সহায়ক হবে। আমি সবেমাত্র একটি জার চালিয়েছি
কেবি দ্বারা অবিবাহিত কলস্ট্যাকের মাধ্যমে সেখানে ছিল:
0008fba8 7c90e9c0 ntdll! KiFastSystemCallRet
0008fbac 7c8025cb ntdll! ZwWaitForSingleObject + + 0xc
0008fc10 7c802532 kernel32! WaitForSingleObjectEx + + 0xa8
0008fc24 00403a13 kernel32! WaitForSingleObject + + 0x12
0008fc40 00402f68 জাভা + + 0x3a13
0008fee4 004087b8 জাভা + + 0x2f68
0008ffc0 7c816fd7 জাভা + + 0x87b8
0008fff0 00000000 kernel32! BaseProcessStart + + 0x23
হাইলাইট লাইনগুলি JVM এ সরাসরি চলমান JIT-ed কোড-
তারপরে আমরা পদ্ধতির ঠিকানা সন্ধান করতে পারি:
জাভা + 0x2f68 হল 00402f68
উইনডিবিজি-তে:
ক্লিক করুন দেখুন -> বিযুক্তি ।
সম্পাদনা -> ঠিকানায় যান ক্লিক করুন। 00402f68 সেখানে
রাখুন
এবং পেয়েছেন
00402f68 55 পুশ
ইবিপি 00402f69 8bec মুভ ইবিপি, এসএসপি
00402f6b 81ec80020000 সাব ইএসপি, 280h
00402f71 53 পুশ ইবিএক্স
00402f72 56 পুশ
এসি 00402f73 57 পুশ এডি
... এবং আরও
অতিরিক্ত তথ্যের জন্য এখানে প্রক্রিয়া এক্সপ্লোরার এবং উইনডিবিজি ব্যবহার করে মেমরি ডাম্পগুলি থেকে জেআইডি-এড কোডটি কীভাবে খুঁজে পাওয়া যায় তার উদাহরণ ।
আপনার হটস্পটগুলির সমাবেশ জেএমএইচ এর পারফেস প্রোফাইলার ( LinuxPerfAsmProfiler
বা WinPerfAsmProfiler
) দিয়ে মুদ্রণ করুন । জেএমএইচ hsdis
লাইব্রেরিটি নির্ভর করে যেহেতু এটি নির্ভর করে PrintAssembly
।