【问题标题】:how can i debug the opening of my application from a file on OSX?如何从 OSX 上的文件中调试我的应用程序的打开?
【发布时间】:2020-05-04 07:54:48
【问题描述】:

我将我的应用程序链接到一个文件扩展名,所以当我双击这些文件时,它会打开我的应用程序。但是,这样做时我会遇到崩溃,我正在寻找一种方法来断点,看看出了什么问题。我正在使用 Xcode,它是一个 OSX 应用程序。

有什么想法吗?

【问题讨论】:

  • 也许您可以将文件扩展名链接到:lldb -- /your/exec/goes/here --your --exec --args --go --here
  • 这可能在打开调试应用时不会打开调试器,对吗?
  • 双击打开文件时,如果应用已经在运行,会不会崩溃?
  • 应用已经运行时不会崩溃

标签: xcode macos debugging


【解决方案1】:

lldb 没有“使用 open AppleEvent 启动”功能,因此您不能直接执行此操作。

但是您可以使用 lldb 的“附加等待”功能在启动的早期捕获应用程序。您可以在 Xcode 中执行此操作,方法是在 App 目标的 Run 方案的 Info 选项卡中打开“等待启动可执行文件”。然后单击“运行”按钮,并转到 Finder 以通过双击其中一个文件来启动您的应用程序。

如果您的系统负载不重,lldb 通常会在应用启动的早期停止应用,通常是在它开始处理打开事件之前。 Xcode 将自动继续应用程序,因此它应该直接运行到崩溃。

如果由于某种原因 lldb 没有足够早地附加,请编辑您的应用程序的主要功能,并在最顶部输入:

int go_on = 0;
while(!go_on) {
  sleep(1);
}

这样,您的应用将在处理 open 事件之前停止启动,从而 lldb 附加时间。附加后,在调试器中暂停应用程序,选择包含此主函数的线程和框架,转到 lldb 控制台并执行以下操作:

(lldb) expr go_on = 1

然后继续。现在您的应用应该完成启动、处理打开事件并崩溃到调试器中。

【讨论】:

  • 我通常将go_on 变量设为volatile,以确保编译器不会对其进行优化。我想它可能不太可能用于调试版本,但仍然如此。
  • 将它传递给 printf 是另一种让它保持活力的非常可靠的方法,特别是如果你这样做 printf("%p\n", &go_on),因为那时编译器根本无法判断你打算用它做什么。但我已经有很长时间没有在 -O0 时过分激进的编译器了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
相关资源
最近更新 更多