2

我有一个 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。

是否有链接器或编译器选项可以使调试器更容易破译代码?

4

0 回答 0