এক্সকোড / এলএলডিবি: সবেমাত্র ফেলে দেওয়া একটি ব্যতিক্রম সম্পর্কে কীভাবে তথ্য পাবেন?


84

ঠিক আছে, তাই ভাবুন যে আমার ব্রেকপয়েন্টটি objc_exception_throwসবেমাত্র ট্রিগার করেছে। আমি ডিবাগার প্রম্পটে বসে আছি, এবং আমি ব্যতিক্রম বিষয় সম্পর্কে আরও কিছু তথ্য পেতে চাই। আমি এটি কোথায় খুঁজে পাব?


4
মনে রাখবেন, ব্যতিক্রমটি সবেমাত্র উত্থাপিত হয়েছে, এর বিবরণটি এখনও কনসোলে মুদ্রিত হয়নি।
কারয়ে লরেঞ্জে

: এই প্রশ্ন পরীক্ষা করে দেখুন stackoverflow.com/questions/711650
নিকোলাই Fetissov

উত্তর:


163

ব্যতিক্রম বস্তুটি প্রথম যুক্তি হিসাবে পাস করা হয়েছে 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

(নোট সব ক্ষেত্রেই আমি পরীক্ষিত এ, ব্যতিক্রম বস্তুর এছাড়াও উপস্থিত ছিলেন যে eaxedxসময়ে রেজিস্টার ব্রেকপয়েন্ট হিট। আমি নিশ্চিত যে করব সবসময় মামলা হতে যদিও নই।)

নীচে মন্তব্য থেকে যুক্ত করা:

ইন lldb জন্য স্ট্যাক ফ্রেম নির্বাচন objc_exception_throwএবং তারপর এই কমান্ড লিখুন:

(lldb) po *(id *)($esp + 4)

6
এলএলডিবি-তে কেউ কীভাবে এটি করবে? আমি একটি ত্রুটি পেয়েছি "ত্রুটি: '
আইডি'র

4
আপনি কি এই তথ্যের উত্স সরবরাহ করতে পারেন? আমি এটি সম্পর্কে আরও পড়তে চাই
জোও নুনস

4
বর্তমানে প্রস্তাবনা সামনে আমার জন্য নিম্নলিখিত কাজগুলো যখন উপর breaing objc_exception_throw মধ্যে LLDB : po *(id *)($esp + 4)
wbououng

7
এই কাজ! যাইহোক, আমি স্ট্যাক ফ্রেম 0 নির্বাচন না করা পর্যন্ত এটি কাজ করে না । ( objc_exception_throw)।
ফ্যানরোল

7
po $eaxসিমুলেটারে আমার জন্য $r0ডিভাইসে থাকা অবস্থায় দুল হিসাবে কাজ করে।
বানরদোম

11

নতুন সিমুলেটরগুলিতে (আইওএস 8, 64 বিট) এক্সকোড 6 আইএম ব্যতিক্রম ফ্রেমে ব্যবহার করে: objc_exception_throw

po $rax

32 বিট এ:

po $eax

র‌্যাক্স কী?

রাক্স একটি 64 বিট নিবন্ধ যা পুরাতন ইক্সকে প্রতিস্থাপন করে

কীভাবে সব রেজিস্টার সন্ধান করবেন?

register read

উত্স উইকিপিডিয়া


হুম ... এক্সকোড .1.১-তে, আমি পাচ্ছি: (এলএলডিবি) পো $ র্যাক ত্রুটি: বাস্তবায়িত হতে পারে না: এক্সিকিউটে আটকানো রেজিস্টার র্যাক্সের মান পড়তে পারেনি, প্রস্তুত করতে পারিনি টোটো
এক্সেকিউটজিট

@ ব্রাডিহিন্টজ সিমুলেটর বা ডিভাইস? আমি এটি 6.0.1 দিয়ে চেষ্টা করেছি
নুনস

আপনি কি আপনার উত্সটির জন্য কোনও লিঙ্ক সরবরাহ করতে পারেন? ধন্যবাদ!
ক্রিস কনভারের

আমি শুধু এলএলডিবিতে লিখেছি: রেজিস্টার পঠন। তারপরে এই তথ্যের সাথে আমরা জানি যে ব্যতিক্রম ফ্রেমে প্রথম রেজিস্টার ব্যতিক্রম বার্তা ধারণ করে।
জোও নুনস

ঠিক আছে আমি কিছু দস্তাবেজগুলি পেয়েছি: র্যাক্স একটি bits৪ বিট নিবন্ধক: -৪-বিট দীর্ঘ মোডে আপনি -৪-বিট রেজিস্টারগুলি ব্যবহার করতে পারেন (যেমন ইক্সের পরিবর্তে র্যাক্স, ইবিএক্সের পরিবর্তে আরবিএক্স ইত্যাদি।)
নুনস

6

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

ব্যতিক্রম খুঁজে পেতে আমার প্রচেষ্টা ব্যবহার po $eaxব্যর্থ error: Couldn't materialize struct: Couldn't read eax (materialize)। পূর্ববর্তী উত্তরগুলি থেকে লিঙ্কযুক্ত নথিগুলিতে বর্ণিত অন্যান্য প্রচেষ্টাও ব্যর্থ হয়েছে।

কীটি ছিল আমাকে প্রথমে objc_exception_throwআমার মূল থ্রেডের ফ্রেমে ক্লিক করতে হয়েছিল । lldb সেই ফ্রেমে শুরু হয় না।

আমার সমস্ত অনুসন্ধান এবং নিম্নলিখিত উদাহরণগুলিতে, এই ব্লগ এন্ট্রিটি আমার পক্ষে কাজ করার উপায়গুলিতে প্রথম ব্যাখ্যা করেছিল। এটি আরও আধুনিক, আগস্ট ২০১২ এ পোস্ট করা হচ্ছে।


1

আপনার যদি ক্যাচ স্টেটমেন্ট থাকে তবে একটি ব্রেকপয়েন্ট দিন এবং আপনি সেই সময়ে ব্যতিক্রম বস্তুটি পরিদর্শন করতে পারেন।

আপনার যদি ক্যাচ স্টেটমেন্ট না থাকে তবে চালিয়ে যান।

আপনি আপনার টার্মিনালে এভাবে একটি বার্তা পাবেন:

অপ্রত্যাশিত ব্যতিক্রম 'এনএসআইএনওটিএলএগ্রিমেন্টএক্সেপশন' এর কারণে অ্যাপ্লিকেশনটি সমাপ্ত করা হচ্ছে, কারণ: ' * - [__ এনএসপ্লেসোল্ডার ডিকোরিয়রি দ্য ডিআইটিউইট অবজেক্টস: ফরকিজ: কাউন্ট:]: অবজেক্ট থেকে শূন্য বস্তু প্রবেশের চেষ্টা [0]'

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

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

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