xcode - لينك - مصحح اخطاء




كيف يمكن استدعاء الأساليب أو تنفيذ الشفرة في مصحح أخطاء LLDB؟ (2)

إذا كنت بحاجة إلى متعدد الأسطر ، فيمكنك استخدام expression :

expression

do {
  try thing.save()
} catch {
  print(error)
}

// code will execute now

سطر فارغ لإنهاء التعليمات البرمجية وتنفيذها.

وأنا أعلم أنني يمكن أن أكتب نوعا من print someFloatVariable عند تعيين نقطة توقف أو po [self someIvarHoldingAnObject] ، ولكن لا يمكنني القيام بأشياء مفيدة مثل:

[self setAlpha:1];

ثم يبصق:

الخطأ: "[self] ليس أمرًا صالحًا.

الغريب في الأمر هو أنه يمكنني الاتصال بـ po [self someIvarHoldingAnObject] وسيقوم بطباعة هذا الوصف.

أعتقد أنني شاهدت مقطع فيديو قبل عام حيث أظهر أحدهم كيفية تنفيذ الشفرة من خلال وحدة التحكم في وقت التشغيل ، وإذا لم أكن مخطئًا ، فقد قدم هذا الشخص حججًا وعيّنت الكائنات أيضًا إلى المؤشرات. كيف يتم فعل ذلك؟


المرجع القانوني لأوامر gdb v. lldb هو http://lldb.llvm.org/lldb-gdb.html

تريد استخدام الأمر expr الذي يقوم بتقييم تعبير. وهو أحد أوامر lldb التي تأخذ "الإدخال الخام" بالإضافة إلى الحجج بحيث تحتاج غالبًا إلى "-" للإشارة إلى مكان انتهاء الوسيطات (expr) والأمر (الأوامر). على سبيل المثال

(lldb) expr -- [self setAlpha:1]

هناك اختصار ، "p" ، الذي يفعل - بالنسبة لك (ولكن لا يسمح بأي حجج) ، على سبيل المثال

(lldb) p [self setAlpha:1]

إذا لم تكن الوظيفة (الوظائف) التي تقوم بطلبها جزءًا من برنامجك ، فغالبًا ما ستحتاج إلى الإعلان بوضوح عن نوع الإرجاع الخاص بهم حتى يعرف lldb كيفية الاتصال بهم. على سبيل المثال

(lldb) p printf("hi\n")
error: 'printf' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
(lldb) p (int)printf("hi\n")
(int) $0 = 3
hi
(lldb)

هناك طريقة neat للعمل على حل المشكلة حجة نقطة Floating ، راجع للشغل. يمكنك إنشاء ملف "تعبير بادئة" الذي تتم إضافته إلى كل تعبير تقوم بإدخاله في lldb ، مع نموذج أولي لطرق صفك. على سبيل المثال ، لدي صف MyClass والذي يرث من NSObject ، فلديه طريقتان مهمتان هما "setArg:" و "getArg" اللتان تحددان وتحصل على ivar عائم. هذا مثال صغير سخيفة ، لكنه يوضح كيفية استخدامه. فيما يلي ملف بادئة كتبته لـ lldb:

@interface NSObject
@end
@interface MyClass : NSObject
- init;
- setArg: (float)arg;
- (float) getArg;
@end

extern "C" {
  int strcmp (const char *, const char *);
  int printf(const char * __restrict, ...);
  void puts (const char *);
}

في ملف ~/.lldbinit أقوم بإضافة

settings set target.expr-prefix /Users/jason/lldb-prefix.h

والآن يمكنني القيام به

(lldb)    p [var getArg]
(float) $0 = 0.5
(lldb)    p [var setArg:0.7]
(id) $1 = 0x0000000100104740
(lldb)    p [var getArg]
(float) $2 = 0.7

ستلاحظ أنني شملت اثنين من وظائف مكتبة C القياسية هنا أيضًا. بعد القيام بذلك ، لست بحاجة إلى الإدلاء بأنواع الإرجاع لهذه الأنواع ، على سبيل المثال

(lldb) p printf("HI\n")
<no result>
HI
(lldb) p strcmp ("HI", "THERE")
(int) $3 = -12

(تم إصلاح شيء لذلك "<no result>" الشيء إلى مصادر TOT lldb بالفعل).





lldb