Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Xcode-如何与lldb地址交互并发送消息_Ios_Xcode_Debugging_Lldb - Fatal编程技术网

Ios Xcode-如何与lldb地址交互并发送消息

Ios Xcode-如何与lldb地址交互并发送消息,ios,xcode,debugging,lldb,Ios,Xcode,Debugging,Lldb,我正在lldb中调试我的应用程序,需要向对象发送消息。 我没有对象变量名(即self.object),而是该对象的地址。 例如,我有一个UIgestureRecognitor,我无权访问该变量,它的地址如下: 0x7fe110297360 我想向其发送一条与手势识别器一起工作的消息: [gestureA requireGestureToFail:gestureB]; 因此,我将其转化为几个变体——每个变体都不成功: expr [0x7fe110297360 requireGestureToF

我正在lldb中调试我的应用程序,需要向对象发送消息。 我没有对象变量名(即self.object),而是该对象的地址。 例如,我有一个
UIgestureRecognitor
,我无权访问该变量,它的地址如下:

0x7fe110297360
我想向其发送一条与手势识别器一起工作的消息:

[gestureA requireGestureToFail:gestureB];
因此,我将其转化为几个变体——每个变体都不成功:

expr [0x7fe110297360 requireGestureToFail:0x7fe10e842c00]
expr (long)[((id)0x7fe110297360) requireGestureToFail:((id)0x7fe10e842c00)]
expr -- [0x7fe110297360 requireGestureToFail:0x7fe10e842c00]
expr -- (long)[((id)0x7fe110297360) requireGestureToFail:((id)0x7fe10e842c00)]
expr [((id)0x7fe110297360) requireGestureToFail:((id)0x7fe10e842c00)]
每一个都会确认一个错误:

error: warning: receiver type 'long' is not 'id' or interface pointer, consider casting it to 'id'
error: no known method '-requireGestureToFail:'; cast the message send to the method's return type
error: 1 errors parsing expression




(lldb) expr [((id)0x7fe110297360) requireGestureToFail:((id)0x7fe10e842c00)]
error: no known method '-requireGestureToFail:'; cast the message send to the method's return type
error: 1 errors parsing expression

那么,你为什么不把它转换成合适的类型呢

exp -- [(UIGestureRecognizer *)address1 requireGestureToFail:(UIGestureRecognizer *)address2];
如果您想多玩一点,并通过它的地址调用这个方法(假设您仍然知道所有类型),下面是一个示例

给定以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    [self setWindow:[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]];
    [[self window] setBackgroundColor:[UIColor purpleColor]];

    UIGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(windowTapped:)];
    [[self window] addGestureRecognizer:gr];
    [[self window] makeKeyAndVisible];
    return YES;
}
在将手势识别器添加到窗口后立即设置制动点,您可以执行以下操作:

(lldb) po [self window]
<UIWindow: 0x7ffd2acaff50; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x7ffd2acb6930>; layer = <UIWindowLayer: 0x7ffd2aca8ac0>>

(lldb) image lookup -v -r -n "-\[UIGestureRecognizer view\]"
1 match found in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/UIKit.framework/UIKit:
        Address: UIKit[0x00000000003c5c03] (UIKit.__TEXT.__text + 3946627)
        Summary: UIKit`-[UIGestureRecognizer view]`
         Module: file = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/UIKit.framework/UIKit", arch = "x86_64"
         Symbol: id = {0x000050db}, range = [0x0000000107ee4c03-0x0000000107ee4c14), name="-[UIGestureRecognizer view]"

(lldb) exp UIView *(*$m)(id, SEL) = (UIView *(*)(id, SEL))0x0000000107ee4c03
(lldb) exp SEL $s = @selector(view)
(lldb) p gr
(UIGestureRecognizer *) $1 = 0x00007ffd2ad38c90
(lldb) exp -- $m((id)0x00007ffd2ad38c90, $s)
(UIView *) $2 = 0x00007ffd2acaff50
(lldb) po $2
<UIWindow: 0x7ffd2acaff50; frame = (0 0; 320 480); hidden = YES; gestureRecognizers = <NSArray: 0x7ffd2acb6930>; layer = <UIWindowLayer: 0x7ffd2aca8ac0>>

(lldb) 
(lldb)po[自窗口]
(lldb)图像查找-v-r-n“-\[UIgestureRecognitizer视图\]”
在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/UIKit.framework/UIKit中找到1个匹配项:
地址:UIKit[0x00000000003c5c03](UIKit.\uuuuuu TEXT.\uuuuuu TEXT+3946627)
摘要:UIKit`-[UIGestureRecognitor视图]`
模块:file=“/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks/UIKit.framework/UIKit”,arch=“x86_64”
Symbol:id={0x000050db},范围=[0x0000000107ee4c03-0x0000000107ee4c14],name=“-[UIgestureRecognitizer视图]”
(lldb)exp UIView*(*$m)(id,SEL)=(UIView*(*)(id,SEL))0x0000000107ee4c03
(lldb)exp SEL$s=@选择器(视图)
(lldb)p gr
(UIgestureRecognitor*)$1=0x00007ffd2ad38c90
(lldb)exp--$m((id)0x00007ffd2ad38c90$s)
(UIView*)$2=0x00007ffd2acaff50
(lldb)po$2
(lldb)
基本上,您要做的是,在内存中找到方法的地址(image lookup命令,-v开关),创建一个临时调试器变量(即这里的$m)然后使用必须传递给每个ObjC方法调用的2个隐藏参数调用此方法。如您所见,比较地址后,您将按预期返回原始窗口。
希望有帮助。

可能重复它不是重复,因为问题只是向指针定义的对象发送消息,但OP也希望将此类对象作为方法的参数传递。我现在尝试了:(lldb)exp--[((uigestureRecognitizer*)0x7fe110297360)requiregestFail:((uigestureRecognitizer*)0x7fe10e842c00错误:没有已知的方法“-RequiredEstureTail:”;强制转换发送到该方法返回类型的消息错误:1解析表达式时出错,然后执行以下操作:exp[((UIgestureRecognitor*)0x7fe110297360)RequiredEstureTail:((UIgestureRecognitor*)0x7fe10e842c00)]错误:没有已知的方法“-requireGestureToFail:”;将消息发送到该方法的返回类型错误:1解析表达式时出错您确定这些确实是UIgestureRecognitor对象地址吗?我已运行快速检查,结果正常:
(lldb)p gr1(UIAPTgestureRecognitor*)$0=0x00007fc3a25411b0(lldb)p gr2(UIAgestureRecognitzer*)$1=0x00007fc3a2541da0(lldb)exp[(UIAgestureRecognitzer*)0x00007fc3a25411b0 RequiremeTestureRecognitzerToFail:(UIAgestureRecognitzer*)0x00007fc3a2541da0(lldb)c进程80231恢复
您可以尝试运行
(lldb)po[(NSObject*)地址类]
了解您真正在处理什么。表达式解析器抱怨不知道您试图调用的方法的返回类型。这很重要,因为不同的返回类型具有不同的调用约定,如果返回类型错误,将损坏堆栈。请尝试将返回类型的强制转换添加到您的注意,maciejs在他非常聪明的小例子中就是这样做的,这就是为什么当您的尝试不起作用时,它会起作用。