在Mac OS X上调试和终止应用程序?

5
大家好,我正在调试一款在Mac OS 10.5上运行的C++应用程序。偶尔,我会做一些坏事导致段错误或其他非法操作。这会导致应用程序挂起一段时间,最终系统对话框通知我崩溃的情况。"挂起"和对话框之间的等待时间相当长,几分钟。如果我试图强制退出应用程序或从命令行中使用“kill -9”命令,什么都不会发生。如果我从调试器(gdb)启动应用程序,在崩溃时我会回到gdb提示符并能够干净地退出进程。但这并不理想,因为gdb加载速度很慢。
无论如何,你们能推荐点什么吗?有没有办法在OS X中禁用崩溃报告机制?
谢谢。
更新1: 以下是XCode执行后留下的僵尸进程。显然,XCode也不能正确停止它们。

你在使用XCode吗?如果是的话,你不应该看到崩溃报告对话框。另外,你是在构建基于GUI的应用程序还是仅仅是控制台应用程序?编辑:顺便提一下,如果你在XCode中运行GUI应用程序时遇到EXEC_BAD_ACCESS错误,你可以简单地按停止图标立即终止正在运行的应用程序。 - Tom
是的,如果我在 XCode 或 gdb 中运行我的应用程序,一切都正常。当我遇到段错误时,应用程序会回到调试器,并且一切都很好。然而,如果我从控制台运行应用程序,它似乎会永远挂起。 - EightyEight
你是如何调用应用程序的?通常,如果一个应用程序崩溃了,进程就死亡了。但是,如果你从其他环境中成功调用了它,可能会有一些资源仍然被打开,导致它无法立即释放,并且你还在等待父进程先做些什么(而且它可能在检测到出现问题方面存在问题)。 - Walt Stoneburner
我正在从命令行调用它。这是一个单元测试套件(gtest),它链接了Qt。它是一个控制台应用程序,所以我像运行控制台应用程序一样运行它。 - EightyEight
尝试使用“活动监视器”工具对其进行分析。也许你会发现一些其他进程在你的崩溃后变得疯狂? - zneak
'ps列表中的“UEs”表示进程处于不可中断的等待状态,并且正在尝试退出。在网上搜索,似乎杀死它们的父进程可能是一个选项,但除此之外你就会“卡住”。当你的应用程序崩溃时,它是否正在访问与您的计算机外部有关的某些资源? - martin clayton
3个回答

1

有一个随 XCode 附带的 CrashReporterPrefs 应用程序(使用 Spotlight 搜索;应该在 /Developer/Applications/Utilities 中)。可以将其设置为服务器模式以禁用应用程序“意外退出”对话框。

这里是另一个建议

sudo chmod 000 /System/Library/CoreServices/Problem\ Reporter.app

要重新启用,请执行以下操作:

sudo chmod 755 /System/Library/CoreServices/Problem\ Reporter.app

可能是应用程序正在转储大型核心文件 - 不过您可能会注意到可用磁盘空间的影响。您可以使用以下方法关闭核心转储:

sudo sysctl -w kern.coredump=0

通过设置=1来重新激活。


是的,我已经尝试过了。对话框不再弹出,但仍然存在延迟问题。 - EightyEight
我不建议使用chmod的方法。修改系统文件或权限会引起麻烦。偏好设置应用程序将执行您要求的操作。 - gavinb
@gavinb - 同意;重新排列建议。 - martin clayton

1

这篇文章来自osxdaily.com,它说你只需要在终端中输入:

defaults write com.apple.CrashReporter DialogType none

不知道这是否能解决延迟问题。


1

我终于搞明白了。

在 /System/Library/CoreServices 目录下:

----------    1 root  wheel    56752 11 Aug  2009 ReportPanic

那一定是我早期尝试禁用烦人的报告对话框时留下的。活着就要学习!:]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接