ios - 我可以让 iOS 进程等待调试器吗?

标签 ios xcode lldb

在测试我的 iOS 应用程序时,我的代码有时会遇到意外情况(精简断言失败),它会向我显示警报,让我知道发生问题的文件和行。

然而,到目前为止,我已经超越了“断言”失败的实际点,所以即使我将 LLDB 附加到进程,也没什么可看的。

有没有办法暂停 iOS 进程,直到我连接了调试器,所以 LLDB 将在故障点正常运行,可以访问调用堆栈、变量等?我不希望应用程序崩溃,就像使用简单的断言一样。

最佳答案

通常这很容易——在你的程序中添加一个busyloop。在 C 术语中,您可能有一个静态文件,例如

static int wait_for_debugger = 1;

然后在你有软断言的时候,
if (bad_condition)
{
    while (wait_for_debugger)
        sleep (1);
}

当您在应用程序中遇到该条件时,线程将在此时永远等待,直到您附加调试器并执行类似的操作
(lldb) e wait_for_debugger = 0

我在 iOS 应用程序中看到的复杂情况是,如果您的应用程序停止响应事件,SpringBoard 会注意到并认为您的应用程序已挂起并将其终止。如果你在主线程上的事件循环仍在执行你会没事的,但是让另一个线程坐在这个busyloop中可能会导致其他问题。当调试器附加到 iOS 进程时,SpringBoard 知道应用程序停止响应事件是可以的(例如,您可能会在断点处停止)但如果它是免费运行的,我看不到它工作.

另一种选择是一直将调试器附加到应用程序,直到您重现故障 - 但我假设它只是偶尔发生?因此,每次从 Xcode 启动它(或从 Xcode 附加到它)可能需要额外的工作,直到您 repo 失败为止。另一方面,如果您可以使用“始终在调试器下运行”模型,则可以在软断言上使用断点。

关于ios - 我可以让 iOS 进程等待调试器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51618136/

相关文章:

objective-c - 如何在 Objective-C (OS X) 中使用静态库?

macos - 分析 Mac OS X 内核核心转储第 2 部分

php - 使用 Charles 和 SSL Apple 推送地址

ios - 使用 API 中的坐标绘制路线

ios - Stripe 和 Apple Pay 无法在 iOS 应用程序中使用

iphone - 通过在 iOS Xcode 中打印 "(lldb)"调用 iphone 中的实例方法设置值导致崩溃

c++ - 如何使用 lldb 从已停止的程序继续?

ios - iPhone 应用程序未连接到 iTunes 商店

python - 在 iOS 应用程序中运行 python 脚本

ios - Xcode 7 - UITabBarController 更改内容大小