c++ - 仅 Debug模式下的 Cocoa 异常

标签 c++ cocoa cmake exc-bad-access objective-c++

我在将 Cocoa 与个人 C++ 库一起使用时遇到了一个奇怪的异常,而该异常仅发生在 Debug模式下 - 在 Release模式下一切正常。需要强调的是,链接我的 C++ 库以获得异常就足够了,我根本不需要调用我的库。

我收到的错误是“异常:EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)”。

C++ 库是使用 CMake 构建的,模式由内部“CMAKE_BUILD_TYPE”决定。该库可以在 GitHub 上找到,但我认为没有人愿意构建它。也因为它相当庞大,我认为没有人愿意看代码。

下面是一个非常简单的示例来演示该错误:

#include <Cocoa/Cocoa.h>

int main()
{
    [NSApplication sharedApplication];
    printf("success\n");
    return 0;
}

如您所见,这个示例根本没有使用我的库。

  • 用“clang main.mm -framework Cocoa”编译它就可以了
  • 用“clang main.mm -framework Cocoa -lmylib”编译它也可以。 “mylib”在这里使用“-DCMAKE_BUILD_TYPE=Release”构建
  • 用“clang main.mm -framework Cocoa -lmylib_d”编译它会产生上述异常。 “lmylib_d”在此处使用“DCMAKE_BUILD_TYPE=Debug”构建。它打印:“段错误:11”。

我不明白。我可能在我的库中做了什么,仅仅因为我链接到它就使 Cocoa 崩溃?我唯一想到的是我定义了自己的全局运算符 new 和 delete。不过,Cocoa 不会使用这些,对吗?

这是完整的堆栈跟踪:

(anonymous namespace)::get_registry() (.8898) 0x00007fff564afd79
SLSNewConnection 0x00007fff56473dc4
SLSMainConnectionID 0x00007fff56474a87
_CFAppSleepSetupCoreGraphics 0x00007fff34649091
____CFRunLoopSetOptionsReason_block_invoke_2 0x00007fff34648738
_dispatch_client_callout 0x00007fff5c43ddb8
dispatch_once_f 0x00007fff5c43dd6b
__CFRunLoopSetOptionsReason 0x00007fff34646ff3
_LSApplicationCheckIn 0x00007fff35ae7abb
_RegisterApplication 0x00007fff32ec192c
GetCurrentProcess 0x00007fff32ec064c
MenuBarInstance::GetAggregateUIMode(unsigned int*, unsigned int*) 0x00007fff3391e4ab
MenuBarInstance::IsVisible() 0x00007fff3391e435
_NSInitializeAppContext 0x00007fff31bc1197
-[NSApplication init] 0x00007fff31bc0590
+[NSApplication sharedApplication] 0x00007fff31bc01e6
main main.mm:5
start 0x00007fff5c477015
start 0x00007fff5c477015

提前感谢您的帮助!

最佳答案

你的库有静态初始化器吗?或者,链接到其他库?这些在调用 main 之前运行,如果它们可能导致问题。特别是当他们尝试与 Foundation/AppKit 交互时。

无论如何,我相当确定以这种方式使用 NSApplication 是不安全的。我相信您必须在调用 NSApplicationMain 的主线程上下文中访问它以设置底层 AppKit 机制。由于您在该机器内崩溃,我认为这是根本问题。

关于c++ - 仅 Debug模式下的 Cocoa 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51348230/

相关文章:

c++ - 使用 opencv 的 hog 实现

c++ - 解码哈夫曼树

c++ - OS X 将扩展与应用程序相关联

cocoa - 将 CoreData 与对象一起使用?

objective-c - NSView * 实例变量的 Obj-C 内存管理

c++ - 构建 docker 镜像时 CMake 错误 : The source directory "/" does not appear to contain CMakeLists. txt

c++ - 适用于 Android 的 FreeType2 交叉编译

c++ - 这个链表函数有什么问题?

objective-c - 当焦点位于字段上时删除的 NSTextField/NSSearchField 默认值

c++ - CMake如何使用动态链接库?