godotengine / godot

Godot Engine – Multi-platform 2D and 3D game engine
https://godotengine.org
MIT License
89.15k stars 20.21k forks source link

Renderer crash (dev assert) on exiting the editor in dev build #80295

Open Zylann opened 1 year ago

Zylann commented 1 year ago

Godot version

4.1 caa8c825671a04f89e046de2207e073acde2651e

System information

Windows 10 64 bits NVIDIA GeForce GTX 1060

Issue description

I was using a dev build of the editor with a C++ debugger attached. I mostly edited a large GDScript file while one UI scene was open, then I closed the editor and it crashed with the following call stack:

godot.windows.editor.dev.x86_64.exe!SelfList<RendererSceneRenderImplementation::RenderForwardClustered::GeometryInstanceForwardClustered>::List::~List() Line 114 (godot4_fork\core\templates\self_list.h:114)
godot.windows.editor.dev.x86_64.exe!RendererSceneRenderImplementation::RenderForwardClustered::~RenderForwardClustered() Line 4045 (godot4_fork\servers\rendering\renderer_rd\forward_clustered\render_forward_clustered.cpp:4045)
godot.windows.editor.dev.x86_64.exe!RendererSceneRenderImplementation::RenderForwardClustered::`scalar deleting destructor'(unsigned int) (Unknown Source:0)
godot.windows.editor.dev.x86_64.exe!memdelete<RendererSceneRenderRD>(RendererSceneRenderRD * p_class) Line 112 (godot4_fork\core\os\memory.h:112)
godot.windows.editor.dev.x86_64.exe!RendererCompositorRD::finalize() Line 150 (godot4_fork\servers\rendering\renderer_rd\renderer_compositor_rd.cpp:150)
godot.windows.editor.dev.x86_64.exe!RenderingServerDefault::_finish() Line 218 (godot4_fork\servers\rendering\rendering_server_default.cpp:218)
godot.windows.editor.dev.x86_64.exe!RenderingServerDefault::finish() Line 246 (godot4_fork\servers\rendering\rendering_server_default.cpp:246)
godot.windows.editor.dev.x86_64.exe!finalize_display() Line 314 (godot4_fork\main\main.cpp:314)
godot.windows.editor.dev.x86_64.exe!Main::cleanup(bool p_force) Line 3631 (godot4_fork\main\main.cpp:3631)
godot.windows.editor.dev.x86_64.exe!widechar_main(int argc, wchar_t * * argv) Line 184 (godot4_fork\platform\windows\godot_windows.cpp:184)
godot.windows.editor.dev.x86_64.exe!_main() Line 204 (godot4_fork\platform\windows\godot_windows.cpp:204)
godot.windows.editor.dev.x86_64.exe!main(int argc, char * * argv) Line 218 (godot4_fork\platform\windows\godot_windows.cpp:218)
godot.windows.editor.dev.x86_64.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Line 232 (godot4_fork\platform\windows\godot_windows.cpp:232)
godot.windows.editor.dev.x86_64.exe!invoke_main() Line 107 (d:\a01\_work\12\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:107)
godot.windows.editor.dev.x86_64.exe!__scrt_common_main_seh() Line 288 (d:\a01\_work\12\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)
godot.windows.editor.dev.x86_64.exe!__scrt_common_main() Line 331 (d:\a01\_work\12\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:331)
godot.windows.editor.dev.x86_64.exe!WinMainCRTStartup(void * __formal) Line 17 (d:\a01\_work\12\s\src\vctools\crt\vcstartup\src\startup\exe_winmain.cpp:17)
kernel32.dll!00007ffdcb657614() (Unknown Source:0)
ntdll.dll!00007ffdcb8c26b1() (Unknown Source:0)

With the following errors in the log:

ERROR: Pages in use exist at exit in PagedAllocator: class RendererSceneRenderImplementation::RenderForwardClustered::GeometryInstanceForwardClustered
   at: PagedAllocator<class RendererSceneRenderImplementation::RenderForwardClustered::GeometryInstanceForwardClustered,0>::~PagedAllocator (D:\PROJETS\INFO\GODOT\Engine\godot4_fork\core/templates/paged_allocator.h:170)
D:\PROJETS\INFO\GODOT\Engine\godot4_fork\core/templates/paged_allocator.h:170 - Pages in use exist at exit in PagedAllocator: class RendererSceneRenderImplementation::RenderForwardClustered::GeometryInstanceForwardClustered
ERROR: FATAL: DEV_ASSERT failed  "_first == nullptr" is false.
   at: SelfList<class RendererSceneRenderImplementation::RenderForwardClustered::GeometryInstanceForwardClustered>::List::~List (D:\PROJETS\INFO\GODOT\Engine\godot4_fork\core/templates/self_list.h:114)
D:\PROJETS\INFO\GODOT\Engine\godot4_fork\core/templates/self_list.h:114 - FATAL: DEV_ASSERT failed  "_first == nullptr" is false.

Steps to reproduce

I don't know the cause yet, so all I can do for now is to report the crash, in case someone knows what's up. I just opened a project, edited a large script containing a bunch of preloads, then closed the editor. If I have it happen again with more insight, I might update the issue.

Minimal reproduction project

N.A

AThousandShips commented 1 year ago

Seems like #77430 popping back up, or new list perhaps causing same problem

Would suspect it's geometry_instance_dirty_list that isn't properly cleared, or the entries not correctly freed

JonathaN7Shepard commented 10 months ago

I've run into this issue or a similar issue indirectly caused by RemoveChild(). When a Godot application closes, certain memory is not freed correctly. So far the source has highlighted this DEV_ASSERT: https://github.com/godotengine/godot/blob/4363ae34fa3f52223ae78ff2f2c187ab99827e3a/core/templates/self_list.h#L165

and getting an "Access Violation" here (the singleton is deleted before being dereferenced here):

https://github.com/godotengine/godot/blob/4363ae34fa3f52223ae78ff2f2c187ab99827e3a/servers/rendering/renderer_canvas_render.h#L154

I'm still trying to isolate the issue in a smaller test case, but it is consistently repeatable in my large project.

RonYanDaik commented 7 months ago

I'm encountering same thing: version 4.2. https://github.com/godotengine/godot/commit/f5696c311cdb09e0a34fa4ba7ef5d2524c515b89 with godot-cpp. call stack:

godot.windows.editor.dev.x86_64.exe!SelfList<RendererSceneRenderImplementation::RenderForwardClustered::GeometryInstanceForwardClustered>::List::~List() Line 165 (d:\YurasGarbage\GitHubRepos\Godot\core\templates\self_list.h:165)
godot.windows.editor.dev.x86_64.exe!RendererSceneRenderImplementation::RenderForwardClustered::~RenderForwardClustered() Line 4174 (d:\YurasGarbage\GitHubRepos\Godot\servers\rendering\renderer_rd\forward_clustered\render_forward_clustered.cpp:4174)
godot.windows.editor.dev.x86_64.exe!RendererSceneRenderImplementation::RenderForwardClustered::`scalar deleting destructor'(unsigned int) (Unknown Source:0)
godot.windows.editor.dev.x86_64.exe!memdelete<RendererSceneRenderRD>(RendererSceneRenderRD * p_class) Line 112 (d:\YurasGarbage\GitHubRepos\Godot\core\os\memory.h:112)
godot.windows.editor.dev.x86_64.exe!RendererCompositorRD::finalize() Line 151 (d:\YurasGarbage\GitHubRepos\Godot\servers\rendering\renderer_rd\renderer_compositor_rd.cpp:151)
godot.windows.editor.dev.x86_64.exe!RenderingServerDefault::_finish() Line 218 (d:\YurasGarbage\GitHubRepos\Godot\servers\rendering\rendering_server_default.cpp:218)
godot.windows.editor.dev.x86_64.exe!RenderingServerDefault::finish() Line 246 (d:\YurasGarbage\GitHubRepos\Godot\servers\rendering\rendering_server_default.cpp:246)
godot.windows.editor.dev.x86_64.exe!finalize_display() Line 321 (d:\YurasGarbage\GitHubRepos\Godot\main\main.cpp:321)
godot.windows.editor.dev.x86_64.exe!Main::cleanup(bool p_force) Line 3789 (d:\YurasGarbage\GitHubRepos\Godot\main\main.cpp:3789)
godot.windows.editor.dev.x86_64.exe!widechar_main(int argc, wchar_t * * argv) Line 184 (d:\YurasGarbage\GitHubRepos\Godot\platform\windows\godot_windows.cpp:184)
godot.windows.editor.dev.x86_64.exe!_main() Line 204 (d:\YurasGarbage\GitHubRepos\Godot\platform\windows\godot_windows.cpp:204)
godot.windows.editor.dev.x86_64.exe!main(int argc, char * * argv) Line 218 (d:\YurasGarbage\GitHubRepos\Godot\platform\windows\godot_windows.cpp:218)
godot.windows.editor.dev.x86_64.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Line 232 (d:\YurasGarbage\GitHubRepos\Godot\platform\windows\godot_windows.cpp:232)
[Inline Frame] godot.windows.editor.dev.x86_64.exe!invoke_main() Line 102 (d:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:102)
godot.windows.editor.dev.x86_64.exe!__scrt_common_main_seh() Line 288 (d:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)
kernel32.dll!00007ff827d87344() (Unknown Source:0)
ntdll.dll!00007ff828c026b1() (Unknown Source:0)
AThousandShips commented 7 months ago

Can you try it with 4.2.1 or 4.2.2.rc1, the version you are using is a pre-release for 4.2, and an old one at that, this might have been fixed

RonYanDaik commented 7 months ago

Just tried it on this one: https://github.com/godotengine/godot/commit/474589eb838623f4a59628c0316d0d27f83ed3d1 should be latest. or I'm not looking at it correctly? Still happening. On exiting editor or game. Although when running editor call stack is a bit different:

godot.windows.editor.dev.x86_64.exe!SelfList<RendererSceneRenderImplementation::SceneShaderForwardClustered::ShaderData>::List::~List() Line 165 (d:\YurasGarbage\GitHubRepos\Godot\core\templates\self_list.h:165)
godot.windows.editor.dev.x86_64.exe!RendererSceneRenderImplementation::SceneShaderForwardClustered::~SceneShaderForwardClustered() Line 483 (d:\YurasGarbage\GitHubRepos\Godot\servers\rendering\renderer_rd\forward_clustered\scene_shader_forward_clustered.cpp:483)
godot.windows.editor.dev.x86_64.exe!RendererSceneRenderImplementation::RenderForwardClustered::~RenderForwardClustered() Line 4227 (d:\YurasGarbage\GitHubRepos\Godot\servers\rendering\renderer_rd\forward_clustered\render_forward_clustered.cpp:4227)
godot.windows.editor.dev.x86_64.exe!RendererSceneRenderImplementation::RenderForwardClustered::`scalar deleting destructor'(unsigned int) (Unknown Source:0)
godot.windows.editor.dev.x86_64.exe!memdelete<RendererSceneRenderRD>(RendererSceneRenderRD * p_class) Line 112 (d:\YurasGarbage\GitHubRepos\Godot\core\os\memory.h:112)
godot.windows.editor.dev.x86_64.exe!RendererCompositorRD::finalize() Line 152 (d:\YurasGarbage\GitHubRepos\Godot\servers\rendering\renderer_rd\renderer_compositor_rd.cpp:152)
godot.windows.editor.dev.x86_64.exe!RenderingServerDefault::_finish() Line 219 (d:\YurasGarbage\GitHubRepos\Godot\servers\rendering\rendering_server_default.cpp:219)
godot.windows.editor.dev.x86_64.exe!RenderingServerDefault::finish() Line 247 (d:\YurasGarbage\GitHubRepos\Godot\servers\rendering\rendering_server_default.cpp:247)
godot.windows.editor.dev.x86_64.exe!finalize_display() Line 322 (d:\YurasGarbage\GitHubRepos\Godot\main\main.cpp:322)
godot.windows.editor.dev.x86_64.exe!Main::cleanup(bool p_force) Line 3840 (d:\YurasGarbage\GitHubRepos\Godot\main\main.cpp:3840)
godot.windows.editor.dev.x86_64.exe!widechar_main(int argc, wchar_t * * argv) Line 184 (d:\YurasGarbage\GitHubRepos\Godot\platform\windows\godot_windows.cpp:184)
godot.windows.editor.dev.x86_64.exe!_main() Line 204 (d:\YurasGarbage\GitHubRepos\Godot\platform\windows\godot_windows.cpp:204)
godot.windows.editor.dev.x86_64.exe!main(int argc, char * * argv) Line 218 (d:\YurasGarbage\GitHubRepos\Godot\platform\windows\godot_windows.cpp:218)
godot.windows.editor.dev.x86_64.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow) Line 232 (d:\YurasGarbage\GitHubRepos\Godot\platform\windows\godot_windows.cpp:232)
[Inline Frame] godot.windows.editor.dev.x86_64.exe!invoke_main() Line 102 (d:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:102)
godot.windows.editor.dev.x86_64.exe!__scrt_common_main_seh() Line 288 (d:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)
kernel32.dll!00007ff827d87344() (Unknown Source:0)
ntdll.dll!00007ff828c026b1() (Unknown Source:0)
jamie-pate commented 2 months ago

I'm suddenly having this crash on 4.3-beta2 with dev_build=true (did not happen on 4.2.2 with dev_build=true)

Godot v4.3.beta2 - Ubuntu 22.04.4 LTS 22.04 - X11 - Vulkan (Forward+) - integrated Intel(R) Graphics (ADL GT2) - 12th Gen Intel(R) Core(TM) i7-12700H (14 Threads)

(dev_build=true adds the DEV_ASSERT macro) scons platform=linuxbsd target=editor optimize=debug dev_build=true debug_symbols=true

Looks like it's this property that's having the issue inside SceneShaderForwardClustered

SelfList<ShaderData>::List shader_list;

stack trace built on b75f0485ba15951b87f1d9a2d8dd0fcd55e178e4:

[1] /lib/x86_64-linux-gnu/libc.so.6(+0x42520) [0x7ffff7c42520] (??:0)
[2] RendererSceneRenderImplementation::SceneShaderForwardClustered::~SceneShaderForwardClustered() (/home/jpate/build/src/godot/./core/templates/self_list.h:168)
[3] RendererSceneRenderImplementation::RenderForwardClustered::~RenderForwardClustered() (/home/jpate/build/src/godot/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp:4377)
[4] void memdelete<RendererSceneRenderRD>(RendererSceneRenderRD*) (/home/jpate/build/src/godot/./core/os/memory.h:119)