জেভিএম-এ সংযুক্ত কোডটি কীভাবে দেখতে পাবেন?


86

কোন জেভিএম-এ জেআইটি দ্বারা উত্পাদিত নেটিভ কোড দেখার কোনও উপায় আছে কি?


আপনি কি নিশ্চিত আপনি জেআইটি-সংকলিত (নেটিভ) কোড, বা কেবল বাইট-কোড দেখতে চান? আমি জিজ্ঞাসা করছি কারণ এই প্রশ্নটি এখানে জিজ্ঞাসা করা কিছু সন্দেহের দিকে নিয়ে যায় যদি আপনি সত্যিই স্থানীয় কোড দেখতে চান ... এবং, দুঃখিত, আমি এই জাতীয় কোনও সরঞ্জামও জানি না।
জিম্পফ

4
আমি প্রাসঙ্গিক JIT- সংকলিত নেটিভ কোডটি দেখতে চাই। অবশ্যই এটি আমার কাজ করা দরকার এমন কিছু নয়, বরং বিভিন্ন ধরণের পরীক্ষা-নিরীক্ষা এবং জিনিসগুলি অনুসন্ধান করা।
alsor.net

মাইনর ফ্রেম চ্যালেঞ্জ: আধুনিক জেভিএমগুলিতে ব্যবহৃত গতিশীল সংকলকটির সংকলিত কোডের কেবল একটি সংস্করণ নেই; এটি ব্যাখ্যা করা শুরু করতে পারে, তারপরে কোনও পদ্ধতি বা এর কেবলমাত্র অংশটি সংকলন করতে পারে, তারপরে ক্লাসগুলি লোড / আনলোড করা বা ব্যবহারের প্যাটার্ন শিফট বা পারফরম্যান্সের পরিসংখ্যানের উপর ভিত্তি করে একাধিকবার এটি পুনরায় কম্পাইল করে। (আমার মনে হয় এটা এমনকি কম্পাইল সংস্করণ বাতিল করে ব্যাখ্যা ফিরে আসতে পারেন যে যদি উপকারী বলে মনে হয়।) সুতরাং আপনি না শুধুমাত্র বিভিন্ন মেশিন, এমনকি একই মেশিনে বিভিন্ন রানে উপর বিভিন্ন কোড পাওয়ার পারে কিন্তু বিভিন্ন সময়ে একই রান ।
gidds

উত্তর:


45

ধরে নিই যে আপনি সান হটস্পট জেভিএম ব্যবহার করছেন (অর্থাত্ ওরাকল দ্বারা জাভা ডটকমের দেওয়া একটি ), আপনি পতাকাটি যুক্ত করতে পারেন

-এক্সএক্স: + মুদ্রণপোস্টোঅসাধারণ

আপনার কোড চলমান যখন। এটি জেআইটি সংকলক দ্বারা উত্পন্ন অনুকূলিতকরণের কোডটি মুদ্রণ করবে এবং বাকী অংশটি ছাড়বে।

আপনি যদি অব্যক্ত না করা অংশগুলি সহ পুরো বাইটোকোড দেখতে চান তবে অ্যাড করুন

-এক্সএক্স: কমাইল সংক্ষিপ্তকরণ = #

যখন আপনি আপনার কোড চালাচ্ছেন।

আপনি এই কমান্ড এবং সাধারণভাবে জে আই টি JIT কার্যকারিতা সম্বন্ধে আরও পড়তে পারেন এখানে


এই বিকল্পটি কি কেবল ডিবাগ বিল্ডগুলিতে বা অন্য কিছুতে উপস্থিত? কারণ আমার জেভিএম ("জাভা (টিএম) এসই রানটাইম এনভায়রনমেন্ট (বিল্ড 1.6.0_16-বি01") ওয়েবে উত্স থেকে এই বৈশিষ্ট্যটি সান জাভা 6 এবং ওপেনজেডিকে উপলভ্য হওয়া সত্ত্বেও এটি সনাক্ত করতে পারে না
জোয়াচিম সাউর

4
হ্যাঁ, ডিইবিইউজি বাইনারিগুলির প্রয়োজন। ব্লগস.ওয়ারউইক.এক.উক
রিকর্ডওয়ার্ববার্টন /

4
এটি কি (আজকাল) -এক্সএক্স হওয়া উচিত নয়? কমপক্ষে আজকাল মুদ্রণযোগ্যতা? আমার মেশিনে পরীক্ষা করা হয়েছে এবং এখানে যা বলা হয়েছে তার সাথে মেলে: wikis.sun.com/display/HotSpotInternals/ মুদ্রণসামগ্রী আপনার প্রয়োজন -XX: + এই বিকল্পের আগে একটি আনলকডায়াগনস্টিকভিএমঅ্যাপশন এবং ডিসসেমব্লার প্লাগইন।
ব্লেজারব্লেড

@ ব্লাইজারব্ল্যাড আমি পাচ্ছি: ভুলভাবে নির্দিষ্ট করা ভিএম বিকল্প 'মুদ্রণযোগ্যতা' ত্রুটি: জাভা ভার্চুয়াল মেশিন তৈরি করতে পারেনি। ত্রুটি: মারাত্মক ব্যতিক্রম ঘটেছে। প্রোগ্রাম প্রস্থান করা হবে।
Koray Tugay

@KorayTugay অন্যান্য উত্তর দেখুন - আপডেট লিঙ্ক wikis.oracle.com/display/HotSpotInternals/PrintAssembly দেওয়া হিসাবে, stackoverflow.com/a/15146962/53974 বা stackoverflow.com/a/4149878/53974 । নিম্নলিখিত নির্দেশাবলী যদি কাজ না করে তবে দয়া করে কিছু উপযুক্ত জায়গায় বিশদটি জিজ্ঞাসা করুন (এটি আপনার ক্ষেত্রে অন্য প্রশ্ন হওয়া উচিত কিনা তা নিশ্চিত নন) এটি উল্লেখ করে।
ব্লেজারব্লেড

77

সাধারণ ব্যবহার

অন্যান্য উত্তর দ্বারা ব্যাখ্যা হিসাবে, আপনি নিম্নলিখিত JVM বিকল্পগুলি দিয়ে চালাতে পারেন:

-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly

একটি নির্দিষ্ট পদ্ধতিতে ফিল্টার

আপনি নিম্নলিখিত সিনট্যাক্স সহ একটি নির্দিষ্ট পদ্ধতিতেও ফিল্টার করতে পারেন:

-XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*MyClass.myMethod

মন্তব্য:

  • আপনার ওএস ইত্যাদির উপর নির্ভর করে দ্বিতীয় যুক্তিটি উদ্ধৃতিগুলির মধ্যে রাখতে হবে etc.
  • যদি পদ্ধতিটি অন্তর্ভুক্ত হয় তবে আপনি কিছু অপটিমাইজেশন মিস করতে পারেন

কীভাবে: উইন্ডোজে প্রয়োজনীয় গ্রন্থাগারগুলি ইনস্টল করুন

আপনি যদি উইন্ডোজ চালাচ্ছেন তবে এই পৃষ্ঠায় কীভাবে বিল্ড এবং ইনস্টল করবেন hsdis-amd64.dllএবং hsdis-i386.dllকোনটি এটির কাজ করা প্রয়োজন তা নির্দেশাবলী রয়েছে । আমরা নীচের অনুলিপি এবং রেফারেন্সের জন্য * পৃষ্ঠার বিষয়বস্তু প্রসারিত:


যেখানে প্রিবিল্ট বাইনারি পাওয়া যায়

আপনি এফসিএমএল প্রকল্প থেকে উইন্ডোজের জন্য প্রিল বিল্ট বাইনারি ডাউনলোড করতে পারেন

কীভাবে উইন্ডোজ বানাবেন hsdis-amd64.dllএবং কীভাবে করবেনhsdis-i386.dll

গাইডের এই সংস্করণটি উইন্ডোজ 8.1 64 বিটে 64-বিট সাইগউইন ব্যবহার করে এবং hsdis-amd64.dll উত্পাদন করে তৈরি করা হয়েছিল

  1. সাইগউইন ইনস্টল করুন । এ Select Packagesপর্দা, নিম্নলিখিত প্যাকেজ যোগ (সম্প্রসারিত করে Develবিভাগ, তারপর একবার ক্লিক Skipপ্রতিটি প্যাকেজ নামের পাশে ট্যাগ):

    • make
    • mingw64-x86_64-gcc-core(শুধুমাত্র জন্য প্রয়োজন hsdis-amd64.dll)
    • mingw64-i686-gcc-core(শুধুমাত্র জন্য প্রয়োজন hsdis-i386.dll)
    • diffutils( Utilsবিভাগে)
  2. সাইগউইন টার্মিনালটি চালান। এটি ইনস্টলার দ্বারা তৈরি ডেস্কটপ বা স্টার্ট মেনু আইকন ব্যবহার করে করা যেতে পারে এবং আপনার সাইগউইন হোম ডিরেক্টরি ( C:\cygwin\home\<username>\বা C:\cygwin64\home\<username>\ডিফল্টরূপে) তৈরি করবে ।

  3. সর্বশেষতম জিএনইউ বিন্টিল উত্স প্যাকেজটি ডাউনলোড করুন এবং এর বিষয়বস্তুগুলি আপনার সাইগউইন হোম ডিরেক্টরিতে বের করুন। লেখার সময় সর্বশেষতম প্যাকেজটি binutils-2.25.tar.bz2। এটির ফলে binutils-2.25আপনার সাইগউইন হোম ডিরেক্টরিতে নামের ডিরেক্টরি (বা সর্বশেষ সংস্করণ যাই হোক না কেন) পাওয়া উচিত in
  4. দ্বারা ডাউনলোড OpenJDK উৎস JDK 8 আপডেট সংগ্রহস্থলের যাচ্ছে , ট্যাগ আপনার ইনস্টল করা JRE সংস্করণ সংশ্লিষ্ট নির্বাচন, এবং bz2 ক্লিক করুন। আপনার সাইগউইন হোম ডিরেক্টরিতে hsdis ডিরেক্টরিটি (খুঁজে পাওয়া গেছে src\share\tools) বের করুন।
  5. সাইগউইন টার্মিনালে, প্রবেশ করান cd ~/hsdis
  6. তৈরি করতে 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প্রয়োজনীয় কারণ, যদিও সাইগউইন একটি লিনাক্স-এর মতো পরিবেশ, এইচএসডি মেকফিল এটিকে এটির মতো চিনতে ব্যর্থ।

  7. বার্তা ./chew: No such file or directoryএবং এর সাথে বিল্ডটি ব্যর্থ হবে gcc: command not found। সম্পাদনা করুন <Cygwin home directory>\hsdis\build\Linux-amd64\bfd\MakefileWordPad বা পরিবর্তনের নোটপ্যাড ++, মত একটি টেক্সট এডিটরে 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যে কোনও প্রিন্ট-অ্যাস্পেসব্ল্যাশন বিকল্প ব্যবহার করবেন তার পাশাপাশি নির্দিষ্ট করুন।

* পৃষ্ঠার লাইসেন্স ক্রিয়েটিভ কমন্স


4
অন্যান্য প্ল্যাটফর্মগুলির জন্য প্রাক-নির্মিত বাইনারিগুলি - কেনাই
আশ্বিন জয়প্রকাশ

@ আশ্বিনজয়প্রকাশ আমাকে এই ফাইলগুলি ম্যাক ওএসে কোথায় রাখার কথা?
Koray Tugay

@ কোরেতুগেই এগুলিকে রেখেছেন/usr/lib/
জিন-

আমি লিঙ্ক-টু পৃষ্ঠার সর্বশেষ সংস্করণটি অনুলিপি করে উত্তরটি আপডেট করেছি, তবে এটি সাধারণত ভার্চটিম অনুলিপি না করে বাহ্যিক সংস্থানগুলিতে আমরা লিঙ্ক করার কারণটি হাইলাইট করে।
আলেকসান্দ্র ডাবিনস্কি

আপডেটের জন্য ধন্যবাদ আলেকসান্ডারডুবিনস্কি আমি এটিকে অনুলিপি করে অনুলিপি করেছি: যদি সেই সাইটটি নামিয়ে আনা হয় তবে আমার উত্তরটি স্বতঃস্ফূর্ত থাকবে ...
অ্যাসিলেস

29

আপনার ব্যবহারের জন্য একটি hsdis প্লাগইন প্রয়োজন PrintAssembly। সুবিধাজনক পছন্দ হ'ল এফসিএমএল লাইব্রেরির উপর ভিত্তি করে এইচএসডি প্লাগইন।

এটি ইউনিক্স-এর মতো সিস্টেমে সংকলন করা যেতে পারে এবং উইন্ডোজে আপনি সোর্সফোরেজে এফসিএমএল ডাউনলোড বিভাগে উপলব্ধ প্রাক-বিল্ট গ্রন্থাগারগুলি ব্যবহার করতে পারেন :

উইন্ডোজ ইনস্টল করতে:

  • ডেলটি বের করুন (এটি hsdis-1.1.2-win32-i386.zip এবং hsdis-1.1.2-win32-amd64.zip এ পাওয়া যাবে)।
  • যেখানে উপস্থিত রয়েছে সেখানে dll অনুলিপি করুন 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 ডিফল্ট বিভাগ রেজিস্টারগুলি দেখায়।
শূন্যগুলি এইচএক্স লিটারেলের ক্ষেত্রে নেতৃস্থানীয় শূন্যগুলি প্রদর্শন করে।

উইন্ডোজের ক্ষেত্রে ইন্টেল সিনট্যাক্স হ'ল একটি ডিফল্ট, যেখানে এটিএনটিটি জিএনইউ / লিনাক্সের জন্য একটি ডিফল্ট।

আরও তথ্যের জন্য দেখুন এফসিএমএল লাইব্রেরি রেফারেন্স ম্যানুয়াল


Lib ঠিক করার জন্য ধন্যবাদ। এটি লিনাক্সেও দুর্দান্ত কাজ করছে। বিশৃঙ্খলা নিচে রাখতে আমার পুরানো মন্তব্যগুলি মুছে ফেলছি।
আলেকসান্দ্র ডাবিনস্কি

লিনাক্স-এ, আমি libhsdis.so ইনস্টল করার পরে এবং hsdis-amd64.so এর সাথে একটি নরম লিঙ্ক তৈরি করার পরে, আমি জাভা কমান্ডটি চালাই, এটি প্রম্পটগুলি hsdis-amd64.so খুঁজে পাবে না। আমি রিবুট করব এবং তারপরে জাভা আবার চালু করি, ঠিক আছে। তাত্ক্ষণিকভাবে নরম লিঙ্কটি কাজ করতে পুনরায় বুট এড়ানো কীভাবে? প্রস্থান?
gfan

4
কিছুটা সংযোজন: কিছু লিনাক্স বিতরণে আপনি কেবল একটি প্যাকেজ ইনস্টল করতে পারেন, উদাহরণস্বরূপ উবুন্টুতে: apt-get install libhsdis0-fcml( Askubuntu.com/a/991166/489909 )। এটি নিজের তৈরি করা প্রয়োজন হতে পারে না।
ডেভিড জর্জি রিচেল্ট

8

হটস্পট (সান ছিল) জেভিএম-এর জন্য এমনকি পণ্য মোডেও:

http://wikis.oracle.com/display/HotSpotInternals/ মুদ্রণ অপ্রয়োজনীয়

কিছু সমাবেশ প্রয়োজন: এটি একটি প্লাগইন প্রয়োজন।


দেখে মনে হচ্ছে আপনার উত্তরের লিঙ্কটি চলে গেছে you আপনি দয়া করে এটি আপডেট করবেন? আগাম ধন্যবাদ।
চাওজুন ঝং

5

আমি বিশ্বাস করি যে আপনি উইন্ডোজ মেশিনে চালনা করলে উইনডিবিজি সহায়ক হবে। আমি সবেমাত্র একটি জার চালিয়েছি

  • তারপরে আমি উইন্ডবজির মাধ্যমে জাভা প্রক্রিয়ার সাথে সংযুক্ত হয়েছি
  • ~ কমান্ড দ্বারা পরীক্ষা করা থ্রেড ; 11 টি থ্রেড ছিল, 0 থ্রেড ছিল মূল কর্মী থ্রেড
  • 0-থ্রেড পাল্টানো হয়েছে - ~ 0 সেঃ
  • কেবি দ্বারা অবিবাহিত কলস্ট্যাকের মাধ্যমে সেখানে ছিল:

    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 পুশ এডি
    ... এবং আরও

অতিরিক্ত তথ্যের জন্য এখানে প্রক্রিয়া এক্সপ্লোরার এবং উইনডিবিজি ব্যবহার করে মেমরি ডাম্পগুলি থেকে জেআইডি-এড কোডটি কীভাবে খুঁজে পাওয়া যায় তার উদাহরণ


4

মেশিন কোড এবং কিছু পারফরম্যান্স ডেটা দেখার আরেকটি উপায় হ'ল এএমডি-র কোডএলালিস্ট বা অপ্রোফিল, যা জাভা কোডটি জাভা কোডটি মেশিন কোড হিসাবে কার্যকর করে দেখার জন্য একটি জাভা প্লাগইন রয়েছে।


1

আপনার হটস্পটগুলির সমাবেশ জেএমএইচ এর পারফেস প্রোফাইলার ( LinuxPerfAsmProfilerবা WinPerfAsmProfiler) দিয়ে মুদ্রণ করুন । জেএমএইচ hsdisলাইব্রেরিটি নির্ভর করে যেহেতু এটি নির্ভর করে PrintAssembly

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.