- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在 Raspberry Pi 3 上开发一个简单的游戏。作为操作系统,我使用官方的 Raspbian Stretch Lite。该游戏在没有 X 服务器的情况下运行,并使用 SFML PI 在 C++ 中开发。图书馆。
问题是游戏有时会卡顿。它可能会在运行游戏几秒钟或几小时后发生,但迟早总会发生。 freeze 的堆栈跟踪表明 eglSwapBuffers
永远不会返回。更重要的是终止游戏并再次运行它没有帮助 - 它在 eglCreatePbufferSurface
调用启动期间卡住。它在重新启动后再次启动。这种卡住的原因是什么?我可以以某种方式调试它吗?我很担心它可能是由 SFML PI 或 EGL 实现中的错误引起的。
主线程卡住期间主线程的堆栈跟踪:
Thread 1 (Thread 0x76293000 (LWP 802)):
#0 0x76f3c014 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=1,
futex_word=0x76459b84 <pool_mem+1444>) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
#1 do_futex_wait (sem=sem@entry=0x76459b84 <pool_mem+1444>, abstime=0x0) at sem_waitcommon.c:115
#2 0x76f3c158 in __new_sem_wait_slow (sem=0x76459b84 <pool_mem+1444>, abstime=0x0) at sem_waitcommon.c:282
#3 0x76804548 in eglSwapBuffers () from /opt/vc/lib/libbrcmEGL.so
#4 0x76ed14b8 in sf::Window::display() () from /usr/lib/libsfml-window.so.2.4
#5 0x000a8038 in Game::run() ()
#6 0x0013d9ec in main ()
杀死游戏后启动过程中卡住的堆栈跟踪:
Thread 1 (Thread 0x76223000 (LWP 1001)):
#0 0x76ecc014 in futex_abstimed_wait_cancelable (private=0, abstime=0x0, expected=1,
---Type <return> to continue, or q <return> to quit---
futex_word=0x767c1a58 <khrn_queue+76>) at ../sysdeps/unix/sysv/linux/futex-internal.h:205
#1 do_futex_wait (sem=sem@entry=0x767c1a58 <khrn_queue+76>, abstime=0x0) at sem_waitcommon.c:115
#2 0x76ecc158 in __new_sem_wait_slow (sem=0x767c1a58 <khrn_queue+76>, abstime=0x0) at sem_waitcommon.c:282
#3 0x763eeb60 in vchiu_queue_pop () from /opt/vc/lib/libvchiq_arm.so
#4 0x7679b014 in rpc_recv () from /opt/vc/lib/libbrcmEGL.so
#5 0x76795b54 in egl_surface_create () from /opt/vc/lib/libbrcmEGL.so
#6 0x767923b8 in eglCreatePbufferSurface () from /opt/vc/lib/libbrcmEGL.so
#7 0x76e635f4 in sf::priv::EglContext::EglContext(sf::priv::EglContext*) () from /usr/lib/libsfml-window.so.2.4
#8 0x76e5f2b0 in sf::priv::GlContext::initResource() () from /usr/lib/libsfml-window.so.2.4
#9 0x76e5f95c in sf::GlResource::GlResource() () from /usr/lib/libsfml-window.so.2.4
#10 0x76e60f54 in sf::Window::Window() () from /usr/lib/libsfml-window.so.2.4
#11 0x76ea2d7c in sf::RenderWindow::RenderWindow(sf::VideoMode, sf::String const&, unsigned int, sf::ContextSettings const&) () from /usr/lib/libsfml-graphics.so.2.4
#12 0x000a8642 in Game::Game() ()
#13 0x0013d9e6 in main ()
最佳答案
免责声明:这不是解决方案,而是可以帮助您识别或解决问题的一些步骤。
What's more killing the game and running it again doesn't help
这意味着您很可能面临驱动程序级别的问题。任何应用程序问题都可以通过重新启动来解决(假设您的应用程序运行相同)。它卡住的事实,加上对 sem_waitcommon
的引用和查看堆栈,当然意味着您遇到了死锁,源自 libbrcmEGL.so
,视频驱动程序。坏消息是,视频驱动程序中会出现错误,解决起来可能相当复杂,而且由于驱动程序是封闭源代码,您无法自行修复它,也无法让社区修复它...
由于您使用的软件和版本的特定组合,我无法找到与您的问题完全匹配的问题,这可能指向一个尚未识别的错误:
下面是一些步骤,从最简单的开始
dmesg
这是一个非常简单的第一步,可能会产生有值(value)的信息。出现问题时,在第一次和第二次卡住后,查看是否有任何显示。任何重要的问题都会在那里提出,并照亮您的问题。
第一步可能是在raspberrypi/linux中报告问题, 有一个 MVE。这可能需要一些时间,但也许是解决该问题的最佳选择,因为 GPU 的固件(Videocore IV,如 libbrcmEGL.so
)是封闭源代码。
您的错误可能是由于驱动程序上的一组特定操作最终触发了您所看到的错误。我建议将您的代码减少到最少,以尝试确定是什么触发了问题。不幸的是,它随机发生的事实无济于事。即使这可能无法解决核心问题,您也可以绕过它。
升级或降级您正在使用的 SFML 和 SFML PI 的版本。同样,这不会解决核心问题,但可能会避免它。
如果这是视频驱动程序中的回归,您可以通过刷新旧版本的分发来修复它,来自 here
为了尽量减少工作量,您可以尝试从 raspberry/firmware 手动 check out 不同版本的 libEGL*
和 libbrcmEGL.so
,但您可能会遇到与它们的依赖项的兼容性问题。
我知道...EGL 肯定会给您带来更好的性能,您可能不需要那个桌面和组合。但是考虑到更大的社区和使用,您遇到的麻烦可能会少得多。因为它使用 libbrcmGLESv2.so
,所以可以保证不会执行相同(可能有问题)的代码。
关于c++ - eglSwapBuffers 永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52918686/
有人可以解释预定义谓词forall如何在列表中找到最小值吗? 最佳答案 对于列表L,您可以使用: member(Min,L), forall(member(N,L), N>=Min). 但是,尽管这是
编辑:澄清一下,我正在搜索的对象数组确实已按搜索变量的字母数字顺序进行了预排序。 我做了一个二分搜索函数并将它嵌套在另一个函数中。出于某种原因,每次我使用二进制搜索都无法找到相关的字符数组。 基本上,
是否可以阻止用户(甚至是管理员)终止我的程序? 或者万一被杀死,它会迅速恢复自身? 更新:澄清一下:我正在编写一个监控程序,类似于家长控制,它记录用户对 PC 的操作。你可以通过查看我最近的其他问题来
我有一个 for 循环,我希望它永远递增。 我的代码: for a in (0...Float::INFINITY).step(2) puts a end 输出: 0.0 2.0 4.0 Et
我很困惑。我有一个运行Ubuntu 14.04的VM。我在这里遵循了以下程序:http://clang.llvm.org/docs/LibASTMatchersTutorial.html,现在正在运行
这是我的代码 #include #include #include #include #include #include #include #include #include usi
我有一个程序会或多或少地通过标准输入使用 COPY FROM 将大量数据复制到 Postgres 9 中。 这目前工作正常,但我正在缓冲数据 block ,然后分批运行 COPY FROM 操作。 我
我想我不小心在某个地方安装了 Foreverjs 并启动了它。每次我杀死这个进程时,另一个进程就会取代它的位置 ] 1 我不知道永远在哪里(或者这实际上是导致它的原因),因为我在本地安装了它。 最佳答
我得到了一个 forever: command not found 当我使用 forever 命令作为 cronjob 运行 nodejs 进程时出现错误(在亚马逊 ec2 机器中):我正在使用的 b
我创建了一些容器,它们还没有准备好使用,总是“重新启动”状态: docker ps CONTAINER ID IMAGE COMMAND
我试图永远重复一个 IO 操作,但是将一个执行的结果输入到下一个执行中。像这样的东西: -- poorly named iterateM :: Monad m => (a -> m a) -> a -
这里的代码样式问题。 我看着this问题,它询问.NET CLR是否真的总是初始化字段值。 (答案是肯定的。)但令我感到惊讶的是,我不确定执行此操作始终是个好主意。我的想法是,如果我看到这样的声明:
美好的一天,我对永久启动\停止脚本有一些问题。 中央操作系统 6.2 内核 2.6.32-220.el6.x86_64 node.js v0.6.19 npm v 1.1.24 永远@0.9.2 我创
我在让管道与 paramiko 一起工作时遇到问题。 这个有效: ssh = paramiko.SSHClient() [...] stdin, stdout, stderr = ssh.exec_c
我希望守护我的 Node.js 应用程序。 Upstart 和永远有什么区别?另外,还有其他我可能想要考虑的软件包吗? 最佳答案 正如评论中指出的,upstart将用于启动 forever脚本,因为
我有以下查询,其中包含在 5 秒内返回数据的选择查询。但是当我在前面添加创建物化 View 命令时,查询需要创建物化 View 。 最佳答案 当您创建物化 View 时,实际上是创建了 Oracle
当我今天访问我的项目的 Google Cloud 控制台并单击“计算引擎”或“云存储”时,它只会永远显示“正在加载”。几天前,我能够看到我的虚拟机和存储桶。有没有办法让控制台再次工作? 谢谢, 麦克风
我编写了一个函数,它当前显示 1000 以下的所有质数。 我可以继续增大 1000 以生成更多数字,但我不知道如何让它在运行后一直持续下去。 func generatePrimes() { l
这是由 another question 触发的. 具体来说,我有一个进程中的 COM 类,它在 CLSID registry 中定义。因为有 ThreadingModel of Both . 我们的
我正在试用新的 React Hooks的 useEffect API,它似乎永远在无限循环中运行!我只希望 useEffect 中的回调运行一次。这是我的引用代码: 单击“运行代码片段”以查看“运行
我是一名优秀的程序员,十分优秀!