我有一个 iOS 项目,它链接到用 C++ 编写的外部静态库。静态库调用由动态链接的 libstdc++ 实现的函数。例如,我调用这个库的初始化函数(我们称之为foo_init()
),它立即调用setlocale()
.
静态库是用 -g 编译的,这意味着调试符号就在我身边,我可以在调试器中单步执行代码。我成功踏入foo_init()
。当我尝试跳过对 的调用时setlocale()
,XCode 并没有完全做到这一点。它最终出现在一个名为dyld_stub_setlocale
. jmp
此函数是执行动态加载和函数调用的单个指令。
我尝试过 Stepping Over/In/Out ofdyld_stub_setlocale
但他们没有让我到达我想要的地方,即回到foo_init()
. Step Over 和 Step In 最终进入stub_helpers
, Step Out 就像 continue 一样。如果我尝试 Step Over/In inside stub_helpers
,XCode 单步和堆栈窗口显示foo_init()
更改为??
. 在这一点上,用于步进/退出的决策树会爆炸,所以我不会详细介绍,但我尝试过的任何组合都不会在调用setlocale
.
我可以为该行设置一个断点,点击继续,让它工作,但这不是用于调试我不太熟悉的静态库的可扩展解决方案。
请注意,我试图找到一种方法来链接 libstdc++-static,这样我就可以避免动态加载程序问题,但是 Apple 已从较新的 SDK 中删除了该库,而我没有较旧的 SDK。
是否有链接器或编译器选项可以使调试器更容易破译代码?