llvm报告使用不同翻译单元中的不兼容类型声明的错误



我正试图在OS X 10.9.2下调试XCode 5.1(5B130a)中的C++OS X应用程序。该应用程序由各种库项目组成,这些库项目被编译成库并在主应用程序项目中使用。

我在代码中设置了一个断点,当我在lldb:中运行时

expr 2

这就是我得到的:

   (lldb) expr 2
   error: field '__f_' declared with incompatible types in different translation units ('__base *' (aka 'std::__1::__function::__base<void (std::__1::shared_ptr<const XXX>, const YYY &)> *') vs. '__base *' (aka 'std::__1::__function::__base<void> *'))
error: field '__f_' declared with incompatible types in different translation units ('__base *' (aka 'std::__1::__function::__base<void (std::__1::shared_ptr<const XXX>, const YYY &)> *') vs. '__base *' (aka 'std::__1::__function::__base<void> *'))
error: expected expression
note: declared here with type '__base *' (aka 'std::__1::__function::__base<void> *')
note: declared here with type '__base *' (aka 'std::__1::__function::__base<void> *')
   error: 3 errors parsing expression

请注意,如果我在代码中的其他地方设置断点,那么相同的命令可能会起作用(但不是所有地方)。这让我想到,我闯入的特定图书馆会有所不同。

我知道std::function<void(std::shared_ptr<const XXX>, const YYY&)>在某个地方有一个定义,而其他翻译单元则认为它有不同的定义(我相信__f_是std::function模板化类的内部字段),但我不清楚:

  • 链接器为什么不抱怨它?(事实上,该应用程序运行良好)
  • 什么代码生成开关不匹配可能导致这种情况?我已经检查了GCC_OPTIMIZATION_LEVEL(所有-O0)、COPY_PHASE_STRIP

谢谢!

这很可能是调试信息的问题,而不是生成的代码的问题,这就是为什么应用程序正确运行,但调试器中的表达式计算器失败的原因。

调试器总是试图读取所需的最少的调试信息,以便执行您要求它执行的任何操作。因此,除非您执行某些操作,导致我们读取具有不一致调试信息的两个模块,否则您不会看到此问题。这就是为什么它有时会发生,有时不会。

无论如何,请使用bugreporter.apple.com.

提交一个关于此问题的错误

最新更新