在阅读ASM 4.1源代码后,我发现了以下实例:
int ASM4 = 4 << 16 | 0 << 8 | 0;
int ASM5 = 5 << 16 | 0 << 8 | 0;
Run Code Online (Sandbox Code Playgroud)
这些左移0到8是否对表达做了什么,或者'或'为0做了什么?
它不等于只有:
int ASM4 = 4 << 16;
int ASM5 = 5 << 16;
Run Code Online (Sandbox Code Playgroud) 我有一个gdb脚本,我正在努力跟踪所有通过objc_msgSend的Objective-C方法调用,但我遇到了一个我似乎无法处理的问题.在查看了Objective-C运行时源代码之后,我开发了以下脚本,以便在objc_msgSend的每个中断处打印[].问题是在某些情况下data_NEVER_USE不是有效指针但也不是null.我能找到一个类是否被初始化的唯一指标是id-> data_NEVER_USE-> flags&RW_REALIZED.我在这里错过了类初始化的哪些方面,这将允许我跳过这种情况?
b objc_msgSend
c
commands
silent
if (*$r0 == 0)
continue
end
set $id = (class_t *)$r0
set $sel = $r1
print *$id
if($id->data_NEVER_USE != 0)
set $data = (class_ro_t *) ($id->data_NEVER_USE)
if (($data->flags & 0x80000000) && ($data->name))
set $classname = $data->name
printf "[%s ", $classname
else
continue
end
end
if ($sel != 0)
printf "%s", $sel
else
printf "null"
end
printf "]\n"
continue
end
Run Code Online (Sandbox Code Playgroud)
我很感激任何帮助.谢谢.