Hi @jshoemaker, thank you for your response and suggestions!
My investigation did include setting breakpoints at the different close
/__del__
/exit
methods, including the one in HabitatSim
(simulator.py). It’s still unclear why this is happening.
This was my observation as well.
This test reliably reproduces the issue:
pytest -s tests/unit/profile_experiment_mixin_test.py::ProfileExperimentMixinTest::test_run_train_epoch_is_profiled -n 0
This is the backtrace from a breakpoint()
set at
tbp.monty/src/tbp/monty/simulators/habitat/simulator.py(631)close()
Note that the test has completed when the error occurs, so it seems it’s the clean up logic from the test handler that’s calling with the missing context. My guess is that the segfault is due to a double-free error or an invalid memory access in the underlying C++ libraries, triggered by an incorrect resource management order. The fact that it happens outside the python scope makes it tricky to debug (and why I tried debugging with lldb
):
> /tbp/tbp.monty/src/tbp/monty/simulators/habitat/simulator.py(631)close()
-> if sim is not None:
(Pdb) bt
/miniconda3/envs/tbp.monty/bin/pytest(8)<module>()
-> sys.exit(console_main())
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/config/__init__.py(187)console_main()
-> code = main()
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/config/__init__.py(164)main()
-> ret: Union[ExitCode, int] = config.hook.pytest_cmdline_main(
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_hooks.py(513)__call__()
-> return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_manager.py(120)_hookexec()
-> return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_callers.py(103)_multicall()
-> res = hook_impl.function(*args)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/main.py(315)pytest_cmdline_main()
-> return wrap_session(config, _main)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/main.py(268)wrap_session()
-> session.exitstatus = doit(config, session) or 0
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/main.py(322)_main()
-> config.hook.pytest_runtestloop(session=session)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_hooks.py(513)__call__()
-> return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_manager.py(120)_hookexec()
-> return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_callers.py(103)_multicall()
-> res = hook_impl.function(*args)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/main.py(347)pytest_runtestloop()
-> item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_hooks.py(513)__call__()
-> return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_manager.py(120)_hookexec()
-> return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_callers.py(103)_multicall()
-> res = hook_impl.function(*args)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py(111)pytest_runtest_protocol()
-> runtestprotocol(item, nextitem=nextitem)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py(130)runtestprotocol()
-> reports.append(call_and_report(item, "call", log))
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py(219)call_and_report()
-> call = call_runtest_hook(item, when, **kwds)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py(258)call_runtest_hook()
-> return CallInfo.from_call(
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py(338)from_call()
-> result: Optional[TResult] = func()
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py(259)<lambda>()
-> lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_hooks.py(513)__call__()
-> return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_manager.py(120)_hookexec()
-> return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_callers.py(103)_multicall()
-> res = hook_impl.function(*args)
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py(166)pytest_runtest_call()
-> item.runtest()
/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/unittest.py(327)runtest()
-> self._testcase(result=self) # type: ignore[arg-type]
/miniconda3/envs/tbp.monty/lib/python3.8/unittest/case.py(736)__call__()
-> return self.run(*args, **kwds)
/miniconda3/envs/tbp.monty/lib/python3.8/unittest/case.py(676)run()
-> self._callTestMethod(testMethod)
/miniconda3/envs/tbp.monty/lib/python3.8/unittest/case.py(633)_callTestMethod()
-> method()
/tbp/tbp.monty/src/tbp/monty/frameworks/environments/embodied_environment.py(119)__del__()
-> self.close()
/tbp/tbp.monty/src/tbp/monty/simulators/habitat/environment.py(178)close()
-> _env.close()
> /tbp/tbp.monty/src/tbp/monty/simulators/habitat/simulator.py(631)close()
-> if sim is not None:
(Pdb) c
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PDB continue >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
[14:34:15:270904]:[Physics] BulletPhysicsManager.cpp(35)::~BulletPhysicsManager : Deconstructing BulletPhysicsManager
GL::Context::current(): no current context
Fatal Python error: Aborted
Current thread 0x000000020361c200 (most recent call first):
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/habitat_sim/simulator.py", line 152 in close
File "/tbp/tbp.monty/src/tbp/monty/simulators/habitat/simulator.py", line 632 in close
File "/tbp/tbp.monty/src/tbp/monty/simulators/habitat/environment.py", line 178 in close
File "/tbp/tbp.monty/src/tbp/monty/frameworks/environments/embodied_environment.py", line 119 in __del__
File "/miniconda3/envs/tbp.monty/lib/python3.8/unittest/case.py", line 633 in _callTestMethod
File "/miniconda3/envs/tbp.monty/lib/python3.8/unittest/case.py", line 676 in run
File "/miniconda3/envs/tbp.monty/lib/python3.8/unittest/case.py", line 736 in __call__
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/unittest.py", line 327 in runtest
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py", line 166 in pytest_runtest_call
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_callers.py", line 103 in _multicall
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_manager.py", line 120 in _hookexec
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_hooks.py", line 513 in __call__
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py", line 259 in <lambda>
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py", line 338 in from_call
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py", line 258 in call_runtest_hook
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py", line 219 in call_and_report
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py", line 130 in runtestprotocol
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/runner.py", line 111 in pytest_runtest_protocol
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_callers.py", line 103 in _multicall
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_manager.py", line 120 in _hookexec
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_hooks.py", line 513 in __call__
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/main.py", line 347 in pytest_runtestloop
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_callers.py", line 103 in _multicall
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_manager.py", line 120 in _hookexec
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_hooks.py", line 513 in __call__
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/main.py", line 322 in _main
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/main.py", line 268 in wrap_session
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/main.py", line 315 in pytest_cmdline_main
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_callers.py", line 103 in _multicall
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_manager.py", line 120 in _hookexec
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/pluggy/_hooks.py", line 513 in __call__
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/config/__init__.py", line 164 in main
File "/miniconda3/envs/tbp.monty/lib/python3.8/site-packages/_pytest/config/__init__.py", line 187 in console_main
File "/miniconda3/envs/tbp.monty/bin/pytest", line 8 in <module>