在调试 Step Over(f6) 时更新到 xcode 11.3 时开始表现类似于 Step Into(f7)。
重现步骤
为 macOS 命令行工具创建一个新的 Xcode 项目
用这个改变 main.cpp
#include <iostream> void test() { std::cout<<"test"; } int main(int argc, const char * argv[]) { test(); return 0; }
转到项目构建设置并添加
-Wl,-no_function_starts
到“其他链接器标志”test
在调用函数的行添加断点并开始调试当断点被击中时尝试 Step Over(f6)
它的行为类似于 Step Into(f7) 并进入测试函数,而不是进入下一个 return 语句。
删除-no_function_starts
标志解决了问题
但我想知道为什么使用标志?它的描述在这里说
-no_function_starts
默认情况下,链接器会在最终链接映像的 LINKEDIT 中创建一个函数起始地址压缩表。此选项禁用该行为。
这个函数起始地址表的重要性是什么?为什么有人会禁用它?它如何影响跨步的 xcode 行为?