XCode OCUnit 在运行任何测试代码之前崩溃并出现 Abort 陷阱:6

Posted

技术标签:

【中文标题】XCode OCUnit 在运行任何测试代码之前崩溃并出现 Abort 陷阱:6【英文标题】:XCode OCUnit crashes with Abort trap: 6 before any test code is run 【发布时间】:2012-09-26 04:20:26 【问题描述】:

我有以下愚蠢的简单测试用例(在带有对应 .h 文件的 .mm 文件中定义)。它使用 boost 尝试从 stringstream 中读取 ptree 以模拟文件中的文本。

-(void)setUp 
  printf("setup\n");

  ::std::stringstream ss;
  ss << "bad format text";

  _configuration = new ptree();
  ::boost::property_tree::read_json(ss, *_configuration);

tearDown 函数什么都不做,并且有一个测试用例也什么也不做。如果我注释掉 read_json 行,一切正常。但如果我按原样运行它,我会得到:

Test Case '-[TestPlanner testPlanner]' started.
libc++abi.dylib: terminate called throwing an exception
/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include: line 415:  3320 Abort trap: 6           "$THIN_TEST_RIG" "$OTHER_TEST_FLAGS" "$TEST_BUNDLE_PATH"
/Applications/Xcode.app/Contents/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/Developer/usr/bin/otest' exited abnormally with code 134 (it may have crashed).

真正疯狂的是,如果我在 SetUp 函数中设置断点,它甚至都不会运行!这是唯一启用的测试,因此即使没有运行单个测试的任何一行,也会发生崩溃。我知道测试设置正确,因为如果我注释掉 read_json 行并设置断点,它确实会到达,我可以在测试用例中包含一些断言,它们会按预期工作。

这也不仅仅是一个提升问题。我最初在从我自己的项目中调用不同的库时遇到了这个问题,但为了简化一切,我只使用了这个 boost 调用。这个完全相同的调用发生在代码的其他部分,所以我很确定我已经正确链接了 boost。我对命名空间非常冗长,所以我认为我没有链接错误版本的函数或其他东西。

我正在运行 XCode 4.5(但在 4.4.1 上遇到同样的问题)并尝试使用 OCUnit 编写单元测试。我正在处理的项目已经在这个框架中编写了一些单元测试,并且这些测试的所有内容似乎都可以正常工作。

我是 Objective C 和 XCode 的新手,但建立这个项目的人肯定不是,他看不出我所做的有任何问题,我们都完全被难住了。

感谢阅读!如果您需要更多信息,请告诉我。

【问题讨论】:

【参考方案1】:

如果它得到一个 C++ 异常,结果是 OCUnit barfs,并且由于某种原因,XCode(或者可能是 lldb)没有正确触发断点。设置代码正在运行,调试器只是不工作。添加 try/catch 块或将代码更改为:

-(void)setUp 
  printf("setup\n");

  ::std::stringstream ss;
  ss << "";

  _configuration = new ptree();
  ::boost::property_tree::read_json(ss, *_configuration);

不会导致异常,并使一切正常。

因此,如果您遇到此问题,解决方法是确保您尝试/捕获测试用例中的所有内容。希望有人能提出更好的答案,因为这似乎是 OCunit 中的一个相当大的错误。

【讨论】:

以上是关于XCode OCUnit 在运行任何测试代码之前崩溃并出现 Abort 陷阱:6的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Xcode 4 和 OCUnit 运行应用程序测试?

OCUnit、NSLog 和 XCode 3.1

iPhone 上的 ocunit 测试

Xcode 的 OCUnit 测试能否在 iOS 设备而不是模拟器上运行

Xcode 4 中的 SenTest OCUnit

如何从命令行在 iPhone 上启动 OCUnit 测试