ঠিক আছে, তাই ভাবুন যে আমার ব্রেকপয়েন্টটি objc_exception_throw
সবেমাত্র ট্রিগার করেছে। আমি ডিবাগার প্রম্পটে বসে আছি, এবং আমি ব্যতিক্রম বিষয় সম্পর্কে আরও কিছু তথ্য পেতে চাই। আমি এটি কোথায় খুঁজে পাব?
ঠিক আছে, তাই ভাবুন যে আমার ব্রেকপয়েন্টটি objc_exception_throw
সবেমাত্র ট্রিগার করেছে। আমি ডিবাগার প্রম্পটে বসে আছি, এবং আমি ব্যতিক্রম বিষয় সম্পর্কে আরও কিছু তথ্য পেতে চাই। আমি এটি কোথায় খুঁজে পাব?
উত্তর:
ব্যতিক্রম বস্তুটি প্রথম যুক্তি হিসাবে পাস করা হয়েছে objc_exception_throw
। LLDB প্রদান করে $arg1
.. $argn
সঠিক কলিং সম্মেলন আর্গুমেন্ট পড়ুন, এটা সহজ ব্যতিক্রম বিবরণ প্রিন্ট করতে উপার্জন ভেরিয়েবল:
(lldb) po $arg1
(lldb) po [$arg1 name]
(lldb) po [$arg1 reason]
objc_exception_throw
এই কমান্ডগুলি কার্যকর করার আগে কল স্ট্যাকের ফ্রেমটি নির্বাচন করার বিষয়টি নিশ্চিত করুন । এটি মঞ্চে সঞ্চালিত দেখতে ডাব্লুডাব্লুডিসি 15 সেশন ভিডিওগুলিতে "অ্যাডভান্সড ডিবাগিং এবং অ্যাড্রেস স্যানিটাইজার" দেখুন।
পুরানো তথ্য
আপনি যদি জিডিবিতে থাকেন তবে প্রথম আর্গুমেন্টের উল্লেখ করার সিনট্যাক্সটি আপনি যে আর্কিটেকচারটি চালাচ্ছেন তার কলিং কনভেনশনগুলির উপর নির্ভর করে। আপনি যদি সত্যিকারের আইওএস ডিভাইসে ডিবাগ করছেন তবে অবজেক্টের পয়েন্টারটি নিবন্ধভুক্ত r0
। এটি মুদ্রণ করতে বা এতে বার্তা প্রেরণের জন্য, নিম্নলিখিত সাধারণ বাক্য গঠনটি ব্যবহার করুন:
(gdb) po $r0
(gdb) po [$r0 name]
(gdb) po [$r0 reason]
আইফোন সিমুলেটারে, সমস্ত ফাংশন আর্গুমেন্ট স্ট্যাকের মধ্যে পাস করা হয়, তাই বাক্য গঠনটি আরও ভয়াবহ। সবচেয়ে কম অভিব্যক্তি আমি যে গঠন করা যেতে পারে পায় এটা হয় *(id *)($ebp + 8)
। জিনিসগুলিকে কম বেদনাদায়ক করে তুলতে, আমি কোনও সুবিধা ভেরিয়েবল ব্যবহার করার পরামর্শ দিই:
(gdb) set $exception = *(id *)($ebp + 8)
(gdb) po $exception
(gdb) po [$exception name]
(gdb) po [$exception reason]
$exception
ব্রেকপয়েন্টে কমান্ড তালিকা যুক্ত করে ব্রেকপয়েন্টটি ট্রিগার করা হলে আপনি স্বয়ংক্রিয়ভাবে সেট করতে পারেন objc_exception_throw
।
(নোট সব ক্ষেত্রেই আমি পরীক্ষিত এ, ব্যতিক্রম বস্তুর এছাড়াও উপস্থিত ছিলেন যে eax
ও edx
সময়ে রেজিস্টার ব্রেকপয়েন্ট হিট। আমি নিশ্চিত যে করব সবসময় মামলা হতে যদিও নই।)
নীচে মন্তব্য থেকে যুক্ত করা:
ইন lldb জন্য স্ট্যাক ফ্রেম নির্বাচন objc_exception_throw
এবং তারপর এই কমান্ড লিখুন:
(lldb) po *(id *)($esp + 4)
objc_exception_throw
মধ্যে LLDB : po *(id *)($esp + 4)
।
objc_exception_throw
)।
po $eax
সিমুলেটারে আমার জন্য $r0
ডিভাইসে থাকা অবস্থায় দুল হিসাবে কাজ করে।
নতুন সিমুলেটরগুলিতে (আইওএস 8, 64 বিট) এক্সকোড 6 আইএম ব্যতিক্রম ফ্রেমে ব্যবহার করে: objc_exception_throw
po $rax
32 বিট এ:
po $eax
র্যাক্স কী?
রাক্স একটি 64 বিট নিবন্ধ যা পুরাতন ইক্সকে প্রতিস্থাপন করে
কীভাবে সব রেজিস্টার সন্ধান করবেন?
register read
এই লেখার সময়, এই পোস্টটি আমার শীর্ষ গুগল হিট: এলএলডিবি প্রিন্ট ব্যতিক্রম । সুতরাং, আমি এই উত্তরটি lldb এবং x86_64 এর অ্যাকাউন্টে যুক্ত করছি।
ব্যতিক্রম খুঁজে পেতে আমার প্রচেষ্টা ব্যবহার po $eax
ব্যর্থ error: Couldn't materialize struct: Couldn't read eax (materialize)
। পূর্ববর্তী উত্তরগুলি থেকে লিঙ্কযুক্ত নথিগুলিতে বর্ণিত অন্যান্য প্রচেষ্টাও ব্যর্থ হয়েছে।
কীটি ছিল আমাকে প্রথমে objc_exception_throw
আমার মূল থ্রেডের ফ্রেমে ক্লিক করতে হয়েছিল । lldb সেই ফ্রেমে শুরু হয় না।
আমার সমস্ত অনুসন্ধান এবং নিম্নলিখিত উদাহরণগুলিতে, এই ব্লগ এন্ট্রিটি আমার পক্ষে কাজ করার উপায়গুলিতে প্রথম ব্যাখ্যা করেছিল। এটি আরও আধুনিক, আগস্ট ২০১২ এ পোস্ট করা হচ্ছে।
আপনার যদি ক্যাচ স্টেটমেন্ট থাকে তবে একটি ব্রেকপয়েন্ট দিন এবং আপনি সেই সময়ে ব্যতিক্রম বস্তুটি পরিদর্শন করতে পারেন।
আপনার যদি ক্যাচ স্টেটমেন্ট না থাকে তবে চালিয়ে যান।
আপনি আপনার টার্মিনালে এভাবে একটি বার্তা পাবেন:
অপ্রত্যাশিত ব্যতিক্রম 'এনএসআইএনওটিএলএগ্রিমেন্টএক্সেপশন' এর কারণে অ্যাপ্লিকেশনটি সমাপ্ত করা হচ্ছে, কারণ: ' * - [__ এনএসপ্লেসোল্ডার ডিকোরিয়রি দ্য ডিআইটিউইট অবজেক্টস: ফরকিজ: কাউন্ট:]: অবজেক্ট থেকে শূন্য বস্তু প্রবেশের চেষ্টা [0]'
যাইহোক , আপনি সম্ভবত এটি অবিরত না করে এটি পরীক্ষা করার কোনও উপায় সন্ধান করছেন কারণ অ্যাপ্লিকেশনটি বন্ধ হয়ে গেলে আপনি আপনার দুর্দান্ত স্ট্যাক ট্রেসটি হারাবেন।
তার জন্য এটির মতো শোনাচ্ছে যে ফনর্ডের উত্তরটি সবচেয়ে ভাল, তবে আমি এটি এলএলডিবিতে কাজ করতে সক্ষম হইনি।