এলএলডিবি (সুইফট): কাঁচা ঠিকানা ব্যবহারের যোগ্য ধরণের ing


95

এমন কোনও এলএলডিবি কমান্ড রয়েছে যা কোনও ব্যবহারযোগ্য সুইফ্ট শ্রেণিতে কোনও কাঁচা ঠিকানা ফেলে দিতে পারে?

উদাহরণ স্বরূপ:

(lldb) po 0x7df67c50 as MKPinAnnotationView

আমি জানি যে এই ঠিকানাটি একটি এমকেপিনএ্যান্টেশন ভিউতে নির্দেশ করে, তবে এটি এমন ফ্রেমের মধ্যে নয় যা আমি নির্বাচন করতে পারি। তবে, আমি কাঁচা ঠিকানাটি একটি এমকেপিনএন্টোটেশনভিউতে কাস্ট করতে চাই যাতে আমি এর বৈশিষ্ট্যগুলি পরীক্ষা করতে পারি। এটা কি সম্ভব?

উত্তর:


154

এক্সকোড 8.2.1 এবং সুইফ্ট 3 এর অধীনে, lldb কমান্ড পো বা পি টাইপড ভেরিয়েবলের সাথে কাজ করবে না। টাইপযুক্ত অবজেক্টের উদাহরণগুলির বৈশিষ্ট্য পরীক্ষা করতে আপনাকে সুইফ্ট কমান্ড প্রিন্ট ব্যবহার করতে হবে । ( Cbowns এর উত্তর ধন্যবাদ !) যেমন:

expr -l Swift -- import UIKit
expr -l Swift -- let $pin = unsafeBitCast(0x7df67c50, to: MKPinAnnotationView.self)
expr -l Swift -- print($pin.alpha)

42
এটি সত্যিই এত কঠিন হওয়া উচিত নয়
Departamento বি

এটি ছিল একটি সামান্য কাউন্টার স্বজ্ঞাত। আমি ভেবেছিলাম (lldb)আমার কনসোলে টাইপ করার দরকার নেই । তবে তা ছাড়া কাজ হয়নি।
মধু

4
উদ্দেশ্য-সি-তে এটি করার কোনও উপায় আছে কি?
p0l এরিস

আমি এই ফিরে পেতে রাখা। আমার সম্ভবত expr -l Swift -- ... এর জন্য একটি এলএলডিবি ওরফে তৈরি করা উচিত
কোয়েন।

49

আপনি unsafeBitCastকোনও বস্তুর উদাহরণে ঠিকানা cast ালতে সুইফটের ফাংশনটি ব্যবহার করতে পারেন :

(lldb) e let $pin = unsafeBitCast(0x7df67c50, MKPinAnnotationView.self)
(lldb) po $pin

তারপরে আপনি $pinযথারীতি - অ্যাক্সেসের বৈশিষ্ট্য, কল পদ্ধতি ইত্যাদি নিয়ে কাজ করতে পারেন

আরও তথ্যের জন্য এই নিবন্ধটি দেখুন: সুইফ্ট মেমরি ডাম্পিং


প্রথম বক্তব্যের জন্য আমি মনে করি আপনি 'এক্সপ্রেস' বা 'এক্সপ্রেশন' ভুলে গেছেন। অন্যথায় এটি দুর্দান্ত কাজ করছে!
jarrodparkes

4
আমি "ত্রুটি পাচ্ছি: এক্সকোড 7.2 তে অঘোষিত শনাক্তকারী 'অনিরাপদ বিটকাস্ট'" ব্যবহার করব use
ডিভাইস 1

8
ত্রুটি (@ দেভিওস) ছাড়াও এটি আরও একটি ত্রুটি রয়েছে যা এটি 7.3.1 এ দেখায়: "ত্রুটি: অজানা টাইপের নাম 'চলুন'"
কার্লোস_এম

4
নোট করুন যে প্রসঙ্গের উপর নির্ভর করে আপনার প্রথমে ব্যবহার করে lldb কে সুইফ্ট মোডে স্যুইচ করতে হবে (lldb) settings set target.language swift। এছাড়াও, কিছু ক্ষেত্রে (যেমন আপনার অ্যাপ্লিকেশন থেকে কোনও প্রকারের কাস্টিং করার সময় আপনার অ্যাপ্লিকেশনটির মডিউলটির বাইরে ব্রেক করার সময়) আপনাকে এটি অনুসরণ করতে হতে পারেe import MyApp
প্যাট্রিক পিজনাপেল

25

এলসিডিবি ফর্ম্যাটটি expressionXcode 7.3-এ পরিবর্তিত হয়েছে বলে মনে হচ্ছে। নিম্নলিখিত আমাকে শুরু করেছে:

(lldb) expr -l Swift -- import UIKit
(lldb) expr -l Swift -- let $view = unsafeBitCast(0x7fb75d8349c0, UIView.self)

15

কাস্টম ক্লাসগুলির জন্য আপনাকে আপনার প্রকল্পটি আমদানি করতে হবে

expr -l Swift -- import MyTestProject
expr -l Swift --  let $vc = unsafeBitCast(0x7fad22c066d0, ViewController.self)
expr -l Swift -- print($vc.view)

4
আমি ত্রুটি পাচ্ছি: এই জাতীয় কোনও মডিউল "মাইপ্রজেক্টনেম" নেই। কোন চিন্তা কিভাবে এটি ঠিক করতে?
আলেকজান্ডার স্টেপানশিন

@ আলেকজান্ডারস্টেপিশিন থ্রেড / স্ট্যাক পথ নির্ধারণের চেষ্টা করুন, উদাহরণ: "মাই অ্যাপ> থ্রেড 1> 12 প্রধান"
জুয়ানমি

12

এক্সকোড 8 / সুইফট 3 হিসাবে, আমার জন্য কী কাজ করেছে তা এখানে। (এটি @ সাইফ্যাক্সনের উত্তরের ভিত্তিতে তৈরি ।)

(lldb) expr -l Swift -- import UIKit
(lldb) expr -l Swift -- let $nav = unsafeBitCast(0x1030ff000, to: UINavigationController.self)

10

উপরের সমস্ত উত্তরের জন্য ধন্যবাদ, অনিরাপদ বিটকাস্ট Xcode 8.3.2 / সুইফট 3 / ম্যাকোস / কোকো অ্যাপ্লিকেশন সহ ভালভাবে কাজ করে।

বর্তমান উদাহরণের একটি ঠিকানা মুখস্থ করুন

(lldb) p tabView.controlTint
(NSControlTint) $R10 = defaultControlTint

(lldb) p self
(LearningStoryboard.NSTabViewController) $R11 = 0x00006080000e2280 {
.....

পরে, তাদের পরীক্ষা করুন

(lldb) p unsafeBitCast(0x00006080000e2280, to: NSTabViewController.self).tabView.controlTint
(NSControlTint) $R20 = graphiteControlTint

(lldb) p $R11.tabView.controlTint
(NSControlTint) $R21 = graphiteControlTint

এরকম কিছু যদি হয়

(lldb) p unsafeBitCast(0x00006080000e2280, to: NSTabViewController.self).tabView.controlTint
error: use of undeclared identifier 'to'

(lldb) p $R11.tabView.controlTint 
error: use of undeclared identifier '$R11'

নিশ্চিত হয়ে নিন যে একত্রিত হওয়ার চেয়ে সুইফট উত্স কোডের স্ট্যাক ফ্রেমগুলির একটি বেছে নিন।

অ্যাপ্লিকেশনটি বিরতি বোতামটি ক্লিক করে বা ব্যতিক্রম ব্যতীত থামিয়ে দেওয়া হওয়ার পরে সম্ভবত এটি ঘটতে পারে । সেই অনুযায়ী একটি স্ট্যাক ফ্রেম চয়ন করে, lldb একটি সঠিক প্রোগ্রামিং ভাষা অনুমান করা যাক ।


10

উদ্দেশ্য-সি সংস্করণ

po ((MKPinAnnotationView *)0x7df67c50).alpha

4
এটি আমার জন্য পুরোপুরি কাজ করেন। আমার ক্ষেত্রে আমি Debug View Hierarchyভিউতে ছিলাম , একটি দৃশ্যে ডান ক্লিক করে তারপরে নির্বাচিত Print description of...। এটি আমাকে একটি মেমরি ঠিকানা দেয় এবং টাইপ করে আমি উপরের কোডটিতে ফেলে দিতে পারি। জেনে ভালো লাগল যে ভিজ্যুয়াল ডিবাগার কনসোলটিকে একটি ওজ-সি ফ্রেমে রাখে।
Trev14

6

আমি স্বীকার করতে চাই তা নির্ধারণ করতে আমার বেশি সময় লেগেছে। এটি @ আফিন্লেসন উত্তরের মতো, তবে আরও ভাল ব্যাখ্যা (আশা করি!) এবং স্থির বাক্য গঠন সহ

আপনি যদি এক্সকোডের ভিউ হায়ারার্কি ডিবাগার ব্যবহার করে কোনও সামগ্রীর বৈশিষ্ট্যগুলি পরীক্ষা করতে চান তবে এটি কাজ করবে: আপনি ডিফল্টরূপে অবজেক্ট প্রসঙ্গে আছেন তাই আপনাকে এটিকে সুইফ্ট প্রসঙ্গে স্যুইচ করতে হবে

  1. প্রথমে আপনার প্রকল্পটি আমদানি করুন (আপনি যদি এখানে সংজ্ঞায়িত কিছু ক্লাস ব্যবহার করতে চান)

expr -l Swift -- import <YOUR PROJECT NAME>

  1. আপনি যা ক্লাস করতে চান তার মেমরি ঠিকানা ব্যবহার করে বস্তুটি কাস্ট করুন

expr -l Swift -- let $vc = unsafeBitCast(0x7fb7c51cb270, to: <YOUR PROJECT NAME>.<YOUR CUSTOM CLASS NAME>.self)

  1. অবজেক্ট থেকে আপনি যে কোনও মানটি চান তা অ্যাক্সেস করুন

expr -l Swift -- print($vc.<PROPERTY NAME>)

উদাহরণ:

expr -l Swift -- import Football

expr -l Swift -- let $vc = unsafeBitCast(0x7fb7c51cb270, to: Football.Ball.self)

expr -l Swift -- print($vc.velocity)


5

আপনার এলএলডিবি অধিবেশনটি সুইফট প্রসঙ্গে শুরু করা হলে @ শি চেনের উত্তর পুরোপুরি কার্যকর হয়। তবে কিছু ক্ষেত্রে আপনি সম্ভবত একটি সুইফট প্রসঙ্গে বাইরের ব্রেকপয়েন্টে থামিয়ে দিয়েছিলেন ; উদাহরণস্বরূপ, যখন এটি উদ্দেশ্য-সি এপিআই-এর প্রতীকী ব্রেকআপপয়েন্ট, বা ডিবাগ ভিউ হায়ারার্কি মোডে (কমপক্ষে Xcode 11.4 হিসাবে)।

error: unknown type name 'let'
error: use of undeclared identifier 'unsafeBitCast'

সেক্ষেত্রে আপনাকে উদ্দেশ্যমূলক-সি ব্যবহার করে এটি পুরানো পদ্ধতিতে করতে হবে:

e MKPinAnnotationView *$pin = (MKPinAnnotationView *)0x7df67c50

এবং এখন আপনি $pinযেমনটি ব্যবহার করতে পারেন ।


3

poএটি একটি উপনাম, যার অর্থ এটি ওভাররাইড করা যেতে পারে। আপনি poঅ্যাজজ্যাক ব্যবহার করে হেক্স ঠিকানাগুলি পরিচালনা করে ওভাররাইড করতে পারেন :

command regex po
s/(0x[[:xdigit:]]+)/expression -l objc -O -- %1/
s/(.+)/expression -O -- %1/

এর কী প্রভাব রয়েছে তা দেখতে আপনি lldb কে এই এলিয়াসগুলি প্রসারিত করতে বলতে পারেন:

(lldb) settings set interpreter.expand-regex-aliases true

এছাড়াও আমি https://github.com/kastiglione/swift_po তৈরি করেছি , যা poসুইফ্টের বিকল্প । এটি অবজেক্টের ঠিকানাগুলি পরিচালনা করে এবং এতে আরও কয়েকটি উন্নতি হয়েছে।


আপনার লিঙ্কটি থেকে, আমার expression -l objc -O -- 0x76543210কাছে কেবল প্রতিক্রিয়া, এবং অ্যাড্রেস থেকে পরিবর্তনশীল শ্রেণিটি জানা দরকার নেই!
tontonCD

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