ভিজ্যুয়াল সি ++ ব্যবহার করে কোডের পিছনে সমাবেশটি কীভাবে দেখবেন?


117

আমি দুটি লাইনের কোডের দক্ষতা সম্পর্কিত আরেকটি প্রশ্ন পড়ছিলাম, এবং ওপি বলেছিল যে তিনি কোডটির পিছনে সমাবেশটির দিকে তাকিয়েছিলেন এবং উভয় লাইনই সমাবেশে অভিন্ন ছিল in একদিকে ডাইগ্রেশন, যখন কোনও প্রোগ্রাম সংকলিত হয় তখন আমি কীভাবে তৈরি সমাবেশ কোডটি দেখতে পারি।

আমি মাইক্রোসফ্টের ভিজ্যুয়াল সি ++ ব্যবহার করছি, তবে আমি এটিও জানতে চাই যে ভিজ্যুয়াল বেসিকটিতে লিখিত কোডের পিছনে সমাবেশটি সম্ভব কিনা view

সুতরাং, আমি কীভাবে সি ++ এবং ভিজ্যুয়াল বেসিকের মতো উচ্চ স্তরের ভাষায় লিখিত একটি প্রোগ্রামের পিছনে সমাবেশ কোডটি দেখতে পারি?


এটিকে এমএসভিসি-তে একটি সমাবেশের তালিকা বলা হয় যেমন অন্যরা ইতিমধ্যে উল্লেখ করেছে। আমি এই ক্লান্তিকর পদক্ষেপগুলি স্বয়ংক্রিয় করতে সম্পাদক প্রসঙ্গ মেনুতে একটি সহজ প্লাগইন তৈরি করেছি: মার্কেটপ্লেস.ভিজুয়ালস্টুডিও
সাইটস?itemName=Trass3r.DevUtils

উত্তর:


149

বিভিন্ন পন্থা রয়েছে:

  1. ভিজ্যুয়াল স্টুডিওতে সি ++ ডিবাগ করার সময় আপনি সাধারণত অ্যাসেম্বলি কোড দেখতে পারেন (এবং এটিও গ্রহন)। ভিজ্যুয়াল স্টুডিওতে এর জন্য প্রশ্নের মধ্যে কোডের একটি ব্রেকপয়েন্ট রাখুন এবং যখন ডিবাগার এটির উপর চাপ দেয় তখন "অ্যাসেমব্লিতে যান" (অথবা সিটিআরএল + ALT + ডি টিপুন) সন্ধান করুন

  2. দ্বিতীয় পদ্ধতির সংকলন করার সময় সমাবেশ তালিকা উত্পন্ন করা হয়। এর জন্য প্রকল্পের সেটিংসে যান -> সি / সি ++ -> আউটপুট ফাইল -> এএসএম তালিকা অবস্থান এবং ফাইলের নাম পূরণ করুন। "সোর্স কোড সহ অ্যাসেম্বলি আউটপুট" নির্বাচন করুন।

  3. প্রোগ্রামটি সংকলন করুন এবং যে কোনও তৃতীয় পক্ষের ডিবাগারটি ব্যবহার করুন। আপনি এর জন্য অলিডিবিজি বা উইনডিবিজি ব্যবহার করতে পারেন। এছাড়াও আপনি আইডিএ (ইন্টারেক্টিভ বিযুক্তকরণ) ব্যবহার করতে পারেন। তবে এটি এটি করার শক্ত উপায়।


5
নোট করুন যে সম্পূর্ণ-প্রোগ্রাম অপ্টিমাইজেশান সক্ষম (কমপক্ষে VS2010 এ) সহ একটি স্ট্যাটিক লাইব্রেরি সংকলনের সময় # 2 পদ্ধতির কাজ হয় না। যা বোঝায় - সংকলক এখনও চূড়ান্ত কোড তৈরি করে নি।
haাফি

3
এটি ভিজ্যুয়াল স্টুডিও 2017
ম্যাথিয়াস

# 2 পদ্ধতির সাথে, আমি কীভাবে সমাবেশটি দেখতে পারি?
ব্যবহারকারী1507435

আপনি যদি ডিফল্ট অবস্থান ব্যবহার করেন তবে ডিবাগ ডিয়ারে একটি .asm ফাইলটি দেখতে হবে।
ব্যবহারকারী 3015682

28

অতিরিক্ত দ্রষ্টব্য: ডিবাগ এসেম্বলারের আউটপুট এবং রিলিজের মধ্যে বড় পার্থক্য রয়েছে। প্রথমটি শিখতে ভাল যে কীভাবে সংকলক সি ++ থেকে এসেম্বলারের কোড উত্পাদন করে। দ্বিতীয়টি শিখতে ভাল যে সংকলকটি বিভিন্ন সি ++ কনস্ট্রাক্টগুলি কীভাবে অনুকূল করে। এক্ষেত্রে কিছু সি ++ - থেকে-asm রূপান্তরগুলি সুস্পষ্ট নয়।


আমি লক্ষ্য করেছি যে ডিবাগ এক্সিকিউটেবলকে ছড়িয়ে দেওয়ার সময় এটি চলমান চলাকালীন কোডটি আনপ্যাক করা মনে হয়, এটি রিলিজ সংস্করণে ঘটে না। পিইআইডি দিয়ে উভয়ই খোলার সময় কেবলমাত্র ডিবাগ সংস্করণটি "মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ 8.0 [ডিবাগ]" দেখায়।
jyz

9
এটা একেবারে সত্য। কিন্তু এটি প্রশ্নের কোনও উত্তর দেয় না।
imallett

25

ক্লিপ সংকলকটির জন্য / এফএ স্যুইচ উল্লেখ করুন। স্যুইচটির মানের উপর নির্ভর করে কেবলমাত্র এসেম্বলি কোড বা উচ্চ-স্তরের কোড এবং অ্যাসেম্বলি কোড একত্রিত। ফাইলের নাম .asm ফাইল এক্সটেনশন পায়। এখানে সমর্থিত মানগুলি:


  • / এফএ সমাবেশ সমাবেশ; .asm
  • / এফএসি মেশিন এবং সমাবেশ কোড; .cod
  • / এফএএস উত্স এবং সমাবেশ কোড; .asm
  • / এফএএসিএস মেশিন, উত্স এবং সমাবেশ কোড; .cod

10

সবচেয়ে সহজ উপায় হ'ল ডিবাগারটি ফায়ার করা এবং ডিসেজেপ্লেস উইন্ডোটি পরীক্ষা করা ।


8

এই উত্তরটির পূর্ববর্তী সংস্করণ (রেক্সটেসটার ডট কমের জন্য "হ্যাক") বেশিরভাগই এখন অপ্রয়োজনীয় যে http://gcc.godbolt.org/ এআরএম, x86, এবং x86-64 (উইন্ডোজ কলিং কনভেনশনকে লক্ষ্য করে সিএল 19 আরসি সরবরাহ করে) , সেই সাইটে জিসিসি, ঝনঝন, এবং আইসিসির বিপরীতে)।

গডবোল্ট সংকলক এক্সপ্লোরার নির্দেশের "গোলমাল" মুছে ফেলার জন্য কম্পাইলার এসএম আউটপুটকে সুন্দরভাবে ফর্ম্যাট করার জন্য ডিজাইন করা হয়েছে, তাই আমি আর্গুমেন্ট গ্রহণকারী কোনও ফাংশনগুলির জন্য asm সন্ধান করার জন্য এটি ব্যবহার করার সুপারিশ করব (যাতে তারা হবে না অপ্টিমাইজড দূরে)।

কিছু সময়ের জন্য, সিএল http://gcc.beta.godbolt.org/ এ উপলব্ধ ছিল তবে মূল সাইটটি নয়, এখন এটি উভয় ক্ষেত্রেই রয়েছে।


Http://rextester.com/l/cpp_online_compiler_visual অনলাইন সংকলক থেকে এমএসভিসি asm আউটপুট পেতে : /FAsকমান্ড লাইন বিকল্পগুলিতে যুক্ত করুন। আপনার প্রোগ্রামটির নিজস্ব পথ খুঁজে বের করুন এবং এর পথে কাজ করার চেষ্টা করুন .asmএবং এটিকে ফেলে দিন। অথবা এটির উপর একটি বিযুক্তি চালান .exe

যেমন http://rextester.com/OKI40941

#include <string>
#include <boost/filesystem.hpp>
#include <Windows.h>

using namespace std;

static string my_exe(void){
    char buf[MAX_PATH];
    DWORD tmp = GetModuleFileNameA( NULL, // self
                                  buf, MAX_PATH);
    return buf;
}

int main() {
    string dircmd = "dir ";
    boost::filesystem::path p( my_exe() );
    //boost::filesystem::path dir = p.parent_path();

    // transform c:\foo\bar\1234\a.exe 
    // into      c:\foo\bar\1234\1234.asm
    p.remove_filename();
    system ( (dircmd + p.string()).c_str() );

    auto subdir = p.end();      // pointing at one-past the end
    subdir--;                   // pointing at the last directory name
    p /= *subdir;               // append the last dir name as a filename
    p.replace_extension(".asm");
    system ( (string("type ") + p.string()).c_str() );
//    std::cout << "Hello, world!\n";
}

... code of functions you want to see the asm for goes here ...

typeএর ডস সংস্করণ cat। আমি এমন আরও কোড অন্তর্ভুক্ত করতে চাইনি যা আমার পক্ষে asm দেখতে চেয়েছিল এমন ফাংশনগুলি সন্ধান করা আরও কঠিন করে তুলবে। (এসটিডি :: এই লক্ষ্যে স্ট্রিং এবং বুস্ট রান কাউন্টার ব্যবহার যদিও! কিছু সি-শৈলী স্ট্রিং ম্যানিপুলেশন স্ট্রিং প্রক্রিয়াকরণের (এবং সম্পর্কে আরো অনুমানের তোলে ফলে বড় বাফার ব্যবহার করে) দ্বারা সর্বোচ্চ দৈর্ঘ্যের নিরাপত্তা / বরাদ্দ উপেক্ষা করে GetModuleFileNameAহায় মোট কম মেশিন কোড হতে হবে।)

আইডিকে কেন, তবে cout << p.string() << endlকেবলমাত্র বেসনাম (উদাহরণস্বরূপ ফাইল নাম, ডিরেক্টরিগুলি ছাড়াই) প্রদর্শন করা হয়, যদিও এর দৈর্ঘ্য মুদ্রণটি দেখায় যে এটি কেবল খালি নাম নয়। (উবুন্টু 15.10 এ ক্রোমিয়াম 48)। coutপ্রোগ্রামের স্টাডআউট এবং ওয়েব ব্রাউজারের মধ্যে কোনও এক সময় সম্ভবত কিছু ব্যাকস্ল্যাশ-এস্কেপ প্রক্রিয়াজাতকরণ রয়েছে ।


@ মিশেলপ্যাচ: ওহ, আমি যা চেষ্টা করেছিলাম তা হ'ল.c_str()পয়েন্টারের মতো দেখতে মুদ্রণ করে। আপনি যদি লিঙ্কটি অনুসরণ করেন তবে আপনি হ্যাক্সডাম্প এ কোডটি দেখতে পাবেন std::string(অক্ষম #if 0)। এটি স্ট্রিংটি ঠিক আছে, তবে coutএটি ওয়েব ব্রাউজারে পাচ্ছে না। কোনও অ-এস্কি অক্ষর নেই, কেবল ব্যাকস্ল্যাশ।
পিটার কর্ডেস

আমি কিছু অনুপস্থিত হতে পারে তবে আপনি কেবল ফাইলের নাম পিsubdir--; p /= *subdir; না কমালে ? অথবা আপনি কী মুদ্রণের চেষ্টা করছেন তা আমি ভুল বুঝছি।
মাইকেল পেচ

আমি অনুমান করি যে আমি আসল কখন ছিল তার subdir--পরে যথেষ্ট বুঝতে পারি নাp /= *subdirsubdirp.end()
মাইকেল পেচ

@ মিশেলপ্যাচ: আপডেট করা মন্তব্য। ফাইলের নাম হিসাবে ব্যবহার করার জন্য আমার পাথের শেষ ডিরেক্টরি উপাদানটি পাওয়া দরকার। এটি কাজ করে, তবে আমাকে কাজ করতে অনেক সময় নিয়েছিল কারণ আমি ভেবেছিলাম GetModuleFileNameAযে সবেমাত্র ফিরে আসছি a.exe। আমি এটি হেক্সডাম্পিং না করে এবং যে দৈর্ঘ্যটি আমি জানতাম যে এটি কাজ করছে তা ছাপানো অবধি ছিল না, এবং আমি প্রোগ্রামটি যে পথটি চালিত করতে চাইতাম, আমি কেবল সে পথটি মুদ্রণ করতে পারি না
পিটার কর্ডেস

1
হ্যাঁ, ওয়েব ব্রাউজারের জন্য রেন্ডার করার সময় ফাইলটির যে অংশটি এটি খারাপভাবে অনুবাদ করেছে সেই অংশটি \\r( \rসংকলকটি আউটপুট করলে ভাল) বলে মনে হয় । p.generic_string()কাজগুলি ব্যবহার করে তবে ব্যাকস্ল্যাশগুলি ফরোয়ার্ড স্ল্যাশ।
মাইকেল পেচ

5

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


5

এমএসভিসির জন্য আপনি লিঙ্কার ব্যবহার করতে পারেন।

লিংক.এক্সই / ডাম্প / লিনেনম্বার / ডিসসেম / আউট: ফু.ডিস foo.dll

প্রতীক পেতে foo.pdb উপলব্ধ থাকা প্রয়োজন


1

রেড গেটের। নেট প্রতিফলক একটি দুর্দান্ত অসাধারণ সরঞ্জাম যা আমাকে কয়েকবারের বেশি সাহায্য করেছে। আপনাকে সহজেই এমএসআইএল দেখানোর বাইরে এই ইউটিলিটির প্লাস পাশটি হ'ল আপনি প্রচুর তৃতীয় পক্ষের ডিএলএল বিশ্লেষণ করতে পারেন এবং এমএফআইএলকে সি # এবং ভিবিতে রূপান্তর করার প্রতিচ্ছবি যত্ন নিতে পারেন।

আমি প্রতিশ্রুতি দিচ্ছি না কোডটি উত্স হিসাবে পরিষ্কার হবে তবে এটি অনুসরণে আপনার খুব বেশি সমস্যা হওয়া উচিত নয়।


2
দ্রষ্টব্য: একত্রিতকারী, asm হিসাবে বিচ্ছিন্ন না করার জন্য কেবল পরিচালিত সম্মেলনগুলিতে প্রযোজ্য।
শন ই

ভাল কথা, আমি এটি একটি "বিধানসভায় কোডের দুটি লাইন একই" পরিবর্তে "সমাবেশে দুটি লাইনের কোড একই" হিসাবে পড়লাম
ডেভ এল

এটি কেবল ডটনেট অ্যাপ্লিকেশনগুলিতে কাজ করবে, ভিজ্যুয়াল সি ++ লিঙ্কার বা সংকলক নয়।
মুহাম্মদ আলী

1

যদি আপনি অ্যাসেম্বলি কোডটি দেখতে ডিবাগিংয়ের কথা বলছেন তবে সবচেয়ে সহজ উপায় হ'ল ডিবাগ-> উইন্ডোজ-> ডিসঅ্যাসাব্যাস (বা আল্ট -8)। এটি আপনাকে একটি কথিত কার্যক্রমে পদক্ষেপ নিতে দেয় এবং ডিসসোপলাইনে থাকতে দেয়।

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