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 运行应用程序测试?