查找已陷入困境的方法

时间:2020-08-24 06:32:17

标签: objective-c lldb

如果我正在使用lldb调试Mach-O二进制文件,那么可以检查内存中的哪些数据结构以确定是否有任何方法混乱?我可以执行任何步骤吗?

还有,有没有办法以编程方式确定是否有任何方法陷入困境?

1 个答案:

答案 0 :(得分:2)

自从您提到lldb以来,您可以在以下位置设置符号断点:

b method_exchangeImplementation
b method_setImplementation
b class_replaceMethod

当您达到以下条件的断点时:
method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2)
您可以像这样检查m1 m2 args选择器名称:

po (SEL)method_getName($arg1)
po (SEL)method_getName($arg2)

对于method_setImplementation(Method _Nonnull m, IMP _Nonnull imp)

po (SEL)method_getName($arg1)

对于class_replaceMethod(Class cls, SEL name, IMP imp, const char *types)

po $arg1
po (SEL)method_getName($arg2)

这些Method可能是通过先前的调用产生的:

class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name)
class_getClassMethod(Class _Nullable cls, SEL _Nonnull name)

如此之后:

b class_getInstanceMethod
b class_getClassMethod

并击中各自的断点,以检查课程:

po $arg1 

检查选择器:

po (SEL)method_getName($arg2)

设置这些符号断点的最佳位置是在这里:

__attribute__((constructor))
static void premain() {
int i = 0;
i++; // put xcode breakpoint here and when hit prep your lldb symbolic bps
}
相关问题