我有一个多线程OS X应用程序,它混合使用C++,Objective-C和Swift。
当我的应用程序关闭时,我在Xcode调试器窗口中看到了这一点:
libc++abi.dylib: Pure virtual function called!
我知道此错误通常是由对C++类构造函数或析构函数中的虚函数的调用引起的。
有一种简单的方法可以找到它的位置吗?所谓“简单”,是指“不对具有虚函数的每个类的每个构造函数和析构函数的每一行都分析调用树”。
我没有看到堆栈跟踪。打印此消息时,调试器不会停止程序。从我的应用程序委托(delegate)的
applicationDidTerminate
方法记录的消息位于此消息之前。我尝试在“所有异常”上设置断点,但是不幸的是,使用大量异常的代码经常会碰到断点。还有其他可以放置断点的符号吗?
最佳答案
C++标准库定义了一些实现底层语言/库功能的“ABI”功能。 libc++
有一个不错的文档,描述了它们here。
其中之一就是__cxa_pure_virtual
,当程序以某种方式调用纯虚函数时会调用vtable
。因此,如果您在此处设置断点,则应该能够找出发生这种情况的位置。
通常,当ojit_code处于中间状态时,当您从构造函数或析构函数内调用虚拟函数时,就会发生纯虚拟函数调用。有关更多详细信息,请参见this answer。
关于c++ - 如何在Xcode中跟踪 “libc++abi.dylib: Pure virtual function called!”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34051749/