链接到 jemalloc 的 SDL2 程序在 Mac os x 但不是 ubuntu 上崩溃
SDL2 program linked against jemalloc crashes on Mac os x but not ubuntu
我按照 this tutorial 使用 SDL2 设置了一个非常简单的 opengl 程序。为了这个问题的目的,我删除了它的一部分。程序打开一个window,设置背景色为红色,循环直到按下escape键
#include <unistd.h>
#include <string>
#include <iostream>
#include <OpenGL/gl.h>
#include <SDL2/SDL.h>
using namespace std;
void CheckSDLError(int line = -1) {
std::string error = SDL_GetError();
if (error != "") {
std::cout << "SLD Error : " << error << std::endl;
if (line != -1) {
std::cout << "\nLine : " << line << std::endl;
}
SDL_ClearError();
}
}
bool SetOpenGLAttributes() {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
return true;
}
SDL_Window *mainWindow;
SDL_GLContext mainContext;
bool sdlInit() {
// Initialize SDL's Video subsystem
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cout << "Failed to init SDL\n";
return false;
}
mainWindow = SDL_CreateWindow("SDL2 window, son", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640, 640, SDL_WINDOW_OPENGL);
if (!mainWindow) {
std::cout << "Unable to create window\n";
CheckSDLError(__LINE__);
return false;
}
// Create our opengl context and attach it to our window
mainContext = SDL_GL_CreateContext(mainWindow);
SetOpenGLAttributes();
// This makes our buffer swap syncronized with the monitor's vertical refresh
SDL_GL_SetSwapInterval(1);
return true;
}
void mainLoop() {
while (true) {
usleep(40000);//40 ms = 40000 us
SDL_Event event;
while (SDL_PollEvent(&event)) {
cout << "here\n";
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
SDL_GL_SwapWindow(mainWindow);
if (event.type == SDL_QUIT) {
return;
}
if (event.type == SDL_KEYDOWN) {
switch (event.key.keysym.sym) {
case SDLK_ESCAPE:
return;
break;
}
}
}
}
}
int main(int argc, char** argv) {
if (!sdlInit()) {
return -1;
}
mainLoop();
SDL_GL_DeleteContext(mainContext);
SDL_DestroyWindow(mainWindow);
SDL_Quit();
return 0;
}
程序编译,links 并按我预期的那样工作,当我在我的 mac 上用
编译时
g++ -g -std=c++0x -Wall main.cpp -o prog -framework opengl -framework SDL2
但是,如果我尝试 link 反对 Facebook's Folly,像这样:
g++ -g -std=c++0x -Wall main.cpp -o prog -framework opengl -framework SDL2 -lfolly
程序仍然编译并且 links 成功。但是,当我 运行 程序时,它每次都会在几秒钟后崩溃。 lldb 显示以下内容:
Process 36200 stopped
* thread #4: tid = 0xf254f, 0x00007fff9c6891f4 libsystem_platform.dylib`OSSpinLockLock + 7, stop reason = EXC_BAD_ACCESS (code=1, address=0x390)
frame #0: 0x00007fff9c6891f4 libsystem_platform.dylib`OSSpinLockLock + 7
libsystem_platform.dylib`OSSpinLockLock:
-> 0x7fff9c6891f4 <+7>: lock
0x7fff9c6891f5 <+8>: cmpxchgl %ecx, (%rdi)
0x7fff9c6891f8 <+11>: je 0x7fff9c6891ff ; <+18>
0x7fff9c6891fa <+13>: jmp 0x7fff9c689d6e ; _OSSpinLockLockSlow
我模糊的理解是 SDL2 是动态 linked 并且在阅读 之后,我假设当我 link 反对愚蠢时,我正在使用一些不同的实现图书馆比我不 link 反对愚蠢。我也不确定它是否相关,但我能够在我的 Ubuntu 桌面上编译上面的代码和 link 以防止愚蠢,并且生成的二进制文件可以 运行 没有任何问题.我需要做什么才能在 Mac 10.11.5 上同时使用 SDL2 和 folly?
此处偶尔有 SDL2 贡献者:
当我 运行 这个时,尽管与 Folly 链接,并且在使用 OSX 10.11.5.
时,我没有看到崩溃
几点观察:
'brew install SDL2' 命令没有安装 SDL2 框架。它看起来将静态库 libSDL2.a 和动态库 libSDL2.dylib 安装到 /usr/local 中,但没有安装 .framework。您可能正在使用来自不同 (non-brew) 安装的 SDL2.framework 吗?
我必须在 g++ 调用中添加 -I/usr/local/include 和 -L/usr/local/lib 才能构建。是否可以从其他地方(例如单独的 SDL2 框架)检索 headers and/or 库?
我系统上的 'g++' 副本实际上是 clang,由 Xcode v7.3.1 提供,我认为 Apple 刚刚链接到 /usr/bin/g++。您使用的是 g++ 的实际版本吗?如果是,是什么版本,来源是什么?
None 就是说它们导致了错误,我主要是想看看我的开发环境和您的开发环境有什么不同。 :-)
我按照 this tutorial 使用 SDL2 设置了一个非常简单的 opengl 程序。为了这个问题的目的,我删除了它的一部分。程序打开一个window,设置背景色为红色,循环直到按下escape键
#include <unistd.h>
#include <string>
#include <iostream>
#include <OpenGL/gl.h>
#include <SDL2/SDL.h>
using namespace std;
void CheckSDLError(int line = -1) {
std::string error = SDL_GetError();
if (error != "") {
std::cout << "SLD Error : " << error << std::endl;
if (line != -1) {
std::cout << "\nLine : " << line << std::endl;
}
SDL_ClearError();
}
}
bool SetOpenGLAttributes() {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
return true;
}
SDL_Window *mainWindow;
SDL_GLContext mainContext;
bool sdlInit() {
// Initialize SDL's Video subsystem
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cout << "Failed to init SDL\n";
return false;
}
mainWindow = SDL_CreateWindow("SDL2 window, son", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640, 640, SDL_WINDOW_OPENGL);
if (!mainWindow) {
std::cout << "Unable to create window\n";
CheckSDLError(__LINE__);
return false;
}
// Create our opengl context and attach it to our window
mainContext = SDL_GL_CreateContext(mainWindow);
SetOpenGLAttributes();
// This makes our buffer swap syncronized with the monitor's vertical refresh
SDL_GL_SetSwapInterval(1);
return true;
}
void mainLoop() {
while (true) {
usleep(40000);//40 ms = 40000 us
SDL_Event event;
while (SDL_PollEvent(&event)) {
cout << "here\n";
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
SDL_GL_SwapWindow(mainWindow);
if (event.type == SDL_QUIT) {
return;
}
if (event.type == SDL_KEYDOWN) {
switch (event.key.keysym.sym) {
case SDLK_ESCAPE:
return;
break;
}
}
}
}
}
int main(int argc, char** argv) {
if (!sdlInit()) {
return -1;
}
mainLoop();
SDL_GL_DeleteContext(mainContext);
SDL_DestroyWindow(mainWindow);
SDL_Quit();
return 0;
}
程序编译,links 并按我预期的那样工作,当我在我的 mac 上用
编译时g++ -g -std=c++0x -Wall main.cpp -o prog -framework opengl -framework SDL2
但是,如果我尝试 link 反对 Facebook's Folly,像这样:
g++ -g -std=c++0x -Wall main.cpp -o prog -framework opengl -framework SDL2 -lfolly
程序仍然编译并且 links 成功。但是,当我 运行 程序时,它每次都会在几秒钟后崩溃。 lldb 显示以下内容:
Process 36200 stopped
* thread #4: tid = 0xf254f, 0x00007fff9c6891f4 libsystem_platform.dylib`OSSpinLockLock + 7, stop reason = EXC_BAD_ACCESS (code=1, address=0x390)
frame #0: 0x00007fff9c6891f4 libsystem_platform.dylib`OSSpinLockLock + 7
libsystem_platform.dylib`OSSpinLockLock:
-> 0x7fff9c6891f4 <+7>: lock
0x7fff9c6891f5 <+8>: cmpxchgl %ecx, (%rdi)
0x7fff9c6891f8 <+11>: je 0x7fff9c6891ff ; <+18>
0x7fff9c6891fa <+13>: jmp 0x7fff9c689d6e ; _OSSpinLockLockSlow
我模糊的理解是 SDL2 是动态 linked 并且在阅读
此处偶尔有 SDL2 贡献者:
当我 运行 这个时,尽管与 Folly 链接,并且在使用 OSX 10.11.5.
时,我没有看到崩溃几点观察:
'brew install SDL2' 命令没有安装 SDL2 框架。它看起来将静态库 libSDL2.a 和动态库 libSDL2.dylib 安装到 /usr/local 中,但没有安装 .framework。您可能正在使用来自不同 (non-brew) 安装的 SDL2.framework 吗?
我必须在 g++ 调用中添加 -I/usr/local/include 和 -L/usr/local/lib 才能构建。是否可以从其他地方(例如单独的 SDL2 框架)检索 headers and/or 库?
我系统上的 'g++' 副本实际上是 clang,由 Xcode v7.3.1 提供,我认为 Apple 刚刚链接到 /usr/bin/g++。您使用的是 g++ 的实际版本吗?如果是,是什么版本,来源是什么?
None 就是说它们导致了错误,我主要是想看看我的开发环境和您的开发环境有什么不同。 :-)