আমি কীভাবে এমন কোনও প্রোগ্রামকে ফাঁদে ফেলতে পারি যা বাশে 139 (বিভাগের ত্রুটি) ফেরত দেয়?


10

আমার কাছে একটি বাশ স্ক্রিপ্ট রয়েছে যা কিছু প্রোগ্রাম পরীক্ষা করে এবং প্রোগ্রামের মধ্যে একটি ফেরত দেয় Segmentation faultতাই আমি আমার স্ক্রিপ্টের মাথায় একটি ফাঁদ যুক্ত করার চেষ্টা করেছি:

trap "echo 'segfault occured!'" SIGSEGV

এটি অবশ্য কিছুই করেনি। আমি ব্যবহার করতাম

echo $?

প্রোগ্রামের পরে যা সেগফল্ট উত্পাদন করে এবং আমি আউটপুট হিসাবে 139 পাই । আমি কীভাবে সেই নির্দিষ্ট ত্রুটি কোডের জন্য একটি ফাঁদ যুক্ত করতে পারি?

উত্তর:


7

trap "$instructions" SIGSEGV শেল নিজেই ফাঁসী বিভাজন ত্রুটি।

আপনি যদি আপনার স্ক্রিপ্টের নীচে চালনা করেন তবে আপনি (বা ) set -eএকটি ফাঁদ রাখতে পারেন । আপনার স্ক্রিপ্টটি সমাপ্ত হলে এটি কার্যকর করা হবে (কোনও কমান্ড ননজারো স্ট্যাটাস ফিরিয়ে দেওয়ার কারণে, অথবা স্পষ্টভাবে কল করে বা স্ক্রিপ্টের শেষের দিকে পড়ে) falling সেগমেন্টেশন ত্রুটির জন্য পরীক্ষা করতে, ফাঁদে প্রবেশের সময় পরীক্ষা করুন। (দ্রষ্টব্য যেটি 139 হতে পারে কারণ প্রোগ্রামটি স্বাভাবিকভাবে 139 স্ট্যাটাসের সাথে ফিরে এসেছে; আপনি যদি শেলটিতে আপনার প্রক্রিয়াজাতকরণ করেন তবে এটি এড়ানো যায়))EXIT0exit$?$?

set -e
trap 'case $? in
        139) echo "segfault occurred";;
      esac' EXIT

বাশ বা ksh বা zsh এ, আপনার set -eপ্রতিটি কমান্ড যা ননজারো স্থিতি ফিরিয়ে দেয় তার পরে ফাঁদ কার্যকর করতে হবে না , আপনি ERRতার পরিবর্তে একটি ফাঁদ রাখতে পারেন । আগের মতো, আপনাকে $?ফাঁদে প্রবেশের সময়টি পরীক্ষা করতে হবে এবং 139 টি করতে পারে (তবে খুব কমই হয়) মানে প্রোগ্রামটি এই স্ট্যাটাসটি ফিরিয়ে দিয়েছে।


6

থেকে man bash:

   trap [-lp] [[arg] sigspec ...]
          The command arg is to  be  read  and  executed  when  the  shell
          receives  signal(s)  sigspec.

যখন আপনার প্রোগ্রামটি সেগফাল্টস করে, আপনার ব্যাশটি কেবলমাত্র একটি SIGCHLDশিশুটি থেকে বেরিয়ে আসে (যেভাবেই হোক না কেন)।

তবে, $?আপনি কিছু শর্তাধীন এবং সঞ্চারিত, এক্সপোডকোড ব্যবহার করতে পারেন SIGCHLD:

trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD

নোট করুন যে set -bmএটি প্রয়োজন হতে পারে যদি (এটি সম্ভবত এটি কী করে) একটি অ-ইন্টারেক্টিভ ব্যাশে (যেমন কোনও স্ক্রিপ্ট) ব্যবহৃত হয়।

সম্পাদনা: আরও দেখুন এই (গিলেজ ') উত্তর একটি অনুরূপ সমস্যা ব্যবহারের bashএবং trap


কিছু অদ্ভুত ঘটনা ঘটে। আমি ফাঁদ ব্যবহার করি trap "echo 'something happened!'" {1..64}এবং এখনও কিছুই পাই না। আমি এমনকি সঙ্গে tryied set -bmএবং set -o monitorকিন্তু Nada।
পিথিকোস

আপনি কি ইন্টারেক্টিভভাবে এটি চেষ্টা করেছেন? trap "echo 'something happened'" {1..31}আমার জন্য কাজ করে ( !এবং সেই সিগন্যাল স্পেসগুলি বাদ দেয় bash: trap: XX: invalid signal specification)।
sr_
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.