কীভাবে স্বয়ংক্রিয়ভাবে জিডিবিতে এক্সিকিউটেবল চালানো যায়?


92

আমি gdbঅবিলম্বে এক্সিকিউটেবল রান করতে চাই, যেমন আমি "রান" টাইপ করেছি (প্রেরণা: "" রান "টাইপ করতে আমি পছন্দ করি না)।

একটি উপায় হ'ল কমান্ডটি এটি gdbপছন্দ করতে পাইপ করা :

$ echo run | gdb myApp

তবে এই পদ্ধতির সাথে সমস্যা হ'ল আপনি gdbযেমন আন্তঃব্যক্তির সাথে আন্তঃব্যবস্থা হারাবেন । যদি ব্রেকআপপয়েন্টটি ট্রিগার করে বা myAppক্র্যাশ করে, gdbছেড়ে যায়। এই পদ্ধতিটি এখানে আলোচনা করা হয়েছে

বিকল্পগুলির দিকে তাকিয়ে --help, আমি এটি করার কোনও উপায় দেখতে পাচ্ছি না, তবে সম্ভবত আমি কিছু মিস করছি।

উত্তর:


129
gdb -ex run ./a.out

আপনার যদি যুক্তিগুলি পাস করার প্রয়োজন হয় a.out:

gdb -ex run --args ./a.out arg1 arg2 ...

সম্পাদনা: ওরিওন বলছে এটি ম্যাক ওএসএক্সে কাজ করে না।

-exপতাকা যেহেতু উপলব্ধ করা হয়েছে GDB-6.4(2005 সালে মুক্তি), কিন্তু ওএসএক্স GDB- র অ্যাপলের কাঁটাচামচ ব্যবহার করে এবং চিতা জন্য সর্বশেষ উপর XCode রয়েছে GDB 6.3.50-20050815 (Apple version gdb-967), তাই আপনার ভাগ্য সীমার বাইরে।

বর্তমান GDB-7.0.1রিলিজ বিল্ডিং একটি সম্ভাব্য সমাধান। শুধু পড়ার বিষয়ে নিশ্চিত এই


4
উত্তর করার জন্য ধন্যবাদ. এই লাইনটি আমার জন্য ঠিক "gdb ./a.out" হিসাবে একই আচরণ করে।
ওরিওন এলিজিল

4
আমি কেবল নিশ্চিত করেছি যে আপনি কমান্ড লাইনে একাধিক-এক্স বিকল্পগুলিও পাস করতে পারেন এবং তারা আপনার কাছে জিডিবি ইনপুট স্থানান্তর করার আগে চলবে।
টুং নগুইন

প্রোগ্রামটির মতো যুক্তি থাকলে এই সমাধানটি কাজ করে না:./a.out a b
গিগিবলালা

যেহেতু ওএসএক্স / এক্সকোড আর জিডিবিটিকে বাক্সের বাইরে সমর্থন করে না (এলএলডিবি হ'ল নতুন জিডিবি), এটি এখন আরও ভাল পদ্ধতির মতো বলে মনে হচ্ছে।
ওরিওন এলিজিল

আমি একটি কমান্ড ফাইল তৈরি করেছি এবং gdb -xলিনাক্স সিস্টেমগুলিতে ব্যবহার করি । ওএস এক্স এলএলভিএম এবং ঝনঝন ব্যবহার করে যাতে এর ডিবাগিং ক্ষমতাগুলি পরীক্ষা করে lldb
দাইসুক আরমাকি

23

আমি একটি জিডিবি-স্ক্রিপ্ট ব্যবহার করব:

gdb -x your-script

যেখানে আপনার স্ক্রিপ্টে এর মতো কিছু রয়েছে:

file a.out
b main
r

এর পরে আপনার কাছে স্বাভাবিক ইন্টারেক্টিভ জিডিবি প্রম্পট রয়েছে

সম্পাদনা :

সত্যিকারের অলসতার জন্য এখানে একটি অপ্টিমাইজেশন রয়েছে:

  1. যেমন স্ক্রিপ্ট সংরক্ষণ .gdbinitমধ্যে working directory
  2. এরপরে আপনি কেবল হিসাবে জিডিবি চালান

    gdb

... এবং gdb স্বয়ংক্রিয়ভাবে .gdbinit এর সামগ্রী লোড করে এবং কার্যকর করে।


আরে উত্তরের জন্য ধন্যবাদ। জিডিবি প্রম্পট না পেয়ে আমি যা চাই ঠিক তার মতো দেখতে, আমি জিডিবি স্থগিত হয়ে যাব এবং আমি কমান্ড লাইনে ফিরে এসেছি যেন আমি "ctrl-z" টাইপ করেছি। যদি আমি "এফজি" করি, তবে জিডিবি আবার চালু হয় এবং অ্যাপটি চালিত হয়। এই OS এক্স হয়
elenzil কালপুরুষ

ওরিয়ন: মিমিএইচএইচ - এটি আমার জন্য অবাক করা। আমি প্রকৃতপক্ষে প্রতিটি ইউনিক্সের স্বাদ ব্যবহার করছি (লিনাক্স, সোলারিস, এআইএক্স) well আপনি কোন জিডিবি সংস্করণ ব্যবহার করছেন?

আমি কেবল এর আচরণটি পুনরায় যাচাই করেছি - এখনও আমাকে ডাব্লু / জিডিবি সাসপেন্ড করা কমান্ড লাইনে উপস্থিত করেছে G
ওরিওন এলিজিল

@orionelenzil কেন ধারণা নেই, তবে আপনি যদি লাইনটি fgপরে রাখেন তবে rএটি
স্নেহপূর্ণভাবে

startকমান্ড জন্য একটি শর্টকাট প্রদান করে b+ + r: stackoverflow.com/a/2119606/895245
সিরো Santilli郝海东冠状病六四事件法轮功

20
(echo r ; cat) | gdb a.out

বিড়াল আপনাকে জিডিবি বিরতির পরে টাইপ করতে দেয়।


ওহ, দুর্দান্ত বিড়ালটিকে থামানোর জন্য আপনাকে জিডিবি ছাড়ার পরে সিটিআরএল-সি করতে হবে, তবে এটি দুর্দান্ত।
ওরিওন এলিজিল

4
দেখে মনে হচ্ছে আপনি এটি ব্যবহার করে জিডিবি ইনস্ট্যান্সে কিছু কী-নিয়ন্ত্রণ হারিয়ে ফেলেছেন।
ট্রেভিও

তদুপরি, এর মতো প্রশ্নগুলি Make breakpoint pending on future shared library load? (y or [n])স্বয়ংক্রিয়ভাবে উত্তর "না" ধরে নেবে।
রুসলান

6

start আদেশ

এই কমান্ডটি আরও একটি ভাল বিকল্প:

gdb -ex start --args ./a.out arg1 arg2

এটি রান করার মতো, তবে একটি অস্থায়ী ব্রেকপয়েন্টও সেট করে mainএবং সেখানে থামে।

আঘাতের পরে এই অস্থায়ী ব্রেকপয়েন্টটি নিষ্ক্রিয় করা হয়।

starti

একটি সম্পর্কিত রয়েছে startiযা প্রোগ্রামটি শুরু করে এবং পরিবর্তে প্রথম নির্দেশে থামে, আরও দেখুন: জিডিবিতে প্রথম মেশিন কোডের নির্দেশে থামছে

আপনি যখন কিছু নিম্ন স্তরের জিনিসগুলি করছেন তখন দুর্দান্ত।


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