Cocoa 仅在调试模式下出现异常
Cocoa Exception in Debug mode only
我在将 Cocoa 与个人 C++ 库一起使用时遇到了一个奇怪的异常,而该异常仅发生在调试模式下 - 在发布模式下一切正常。并强调,我的 C++ 库 link 足以获得异常,我根本不需要调用我的库。
我得到的错误是 "Exception: 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;
}
如您所见,这个例子根本没有使用我的库。
- 用 "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" 构建。它打印:"Segmentation fault: 11".
我不明白。我可能在我的库中做了什么,仅仅因为我 link 就崩溃了 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
提前感谢您的帮助!
你的库有静态初始化器吗?或者,link 到其他库呢?这些是 运行 在调用 main 之前,以及它们是否会导致问题。特别是当他们尝试与 Foundation/AppKit.
互动时
无论如何,我相当确定以这种方式使用 NSApplication 是不安全的。我相信您必须在主线程的上下文中访问它,该主线程调用 NSApplicationMain
来设置底层 AppKit 机制。既然你在那台机器里崩溃了,我认为这是根本问题。
确实@Kai Guther 是正确的。 Cocoa 正在使用我覆盖的全局新文件。显然我在替换的新操作员中有一个错误。在对该函数进行一些重构之后,它现在可以工作了。
感谢您提供重要信息...我想如果没有那个猜测,我会为那个可怕的错误搜索多年...
我在将 Cocoa 与个人 C++ 库一起使用时遇到了一个奇怪的异常,而该异常仅发生在调试模式下 - 在发布模式下一切正常。并强调,我的 C++ 库 link 足以获得异常,我根本不需要调用我的库。
我得到的错误是 "Exception: 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;
}
如您所见,这个例子根本没有使用我的库。
- 用 "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" 构建。它打印:"Segmentation fault: 11".
我不明白。我可能在我的库中做了什么,仅仅因为我 link 就崩溃了 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
提前感谢您的帮助!
你的库有静态初始化器吗?或者,link 到其他库呢?这些是 运行 在调用 main 之前,以及它们是否会导致问题。特别是当他们尝试与 Foundation/AppKit.
互动时无论如何,我相当确定以这种方式使用 NSApplication 是不安全的。我相信您必须在主线程的上下文中访问它,该主线程调用 NSApplicationMain
来设置底层 AppKit 机制。既然你在那台机器里崩溃了,我认为这是根本问题。
确实@Kai Guther 是正确的。 Cocoa 正在使用我覆盖的全局新文件。显然我在替换的新操作员中有一个错误。在对该函数进行一些重构之后,它现在可以工作了。 感谢您提供重要信息...我想如果没有那个猜测,我会为那个可怕的错误搜索多年...