繁体   English   中英

仅在调试模式下可可异常

[英]Cocoa Exception in Debug mode only

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

我得到的错误是“异常:EXC_BAD_ACCESS(code = EXC_I386_GPFLT)”。

C ++库是使用CMake构建的,其模式由内部的“ CMAKE_BUILD_TYPE”确定。 该库可以在GitHub上找到,尽管我不认为有人愿意构建它。 另外,由于它非常庞大,所以我不认为有人想看一下代码。

演示该错误的一个非常简单的示例如下:

#include <Cocoa/Cocoa.h>

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

如您所见,该示例根本不使用我的lib。

  • 用“ clang main.mm -framework Cocoa”编译就可以了
  • 用“ clang main.mm -framework可可-lmylib”进行编译也可以。 这里使用“ -DCMAKE_BUILD_TYPE =发布”来构建“ mylib”
  • 使用“ clang main.mm -framework可可-lmylib_d”进行编译会产生上述异常。 这里使用“ DCMAKE_BUILD_TYPE =调试”构建“ lmylib_d”。 它打印:“ Segmentation fault:11”。

我不明白 我可能会因为链接到可可而使我的图书馆崩溃了吗? 我唯一想到的就是我已经定义了自己的全局运算符new和delete。 不过,可可不会用那些,对吗?

这是完整的堆栈跟踪:

(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机制的主线程的上下文中访问它。 由于您正在崩溃,所以我认为这是潜在的问题。

确实,@ Kai Guther是正确的。 可可使用的是我覆盖的全球新产品。 显然我替换的新运算符中有一个错误。 在对该函数进行了一些重构之后,它现在可以工作了。 感谢您提供重要的信息...我想,如果没有这个猜测,我就会寻找那个可怕的bug的年龄...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM