at_exit hook sometimes freeze forever when a rails application executes test codes

Open
#1,153 3 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
30/100
Issue type
Bug
Clarity
Needs clarification
Activity status
Stale
Tech stack
ruby
Domain
devtools

Research direction

Start by tracing the debug gem's at_exit hook and its behavior after a fork, using the Rails test-code sequence described in the issue as the reproduction context. Check how it waits for non-Ruby child processes and verify that the process finishes successfully without waiting indefinitely.

Written by the indexing model from the issue text.

Description

Your environment

  • ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [x86_64-linux]
  • rdbg 1.11.0

Describe the bug

This issue is related to https://github.com/ruby/debug/issues/1113.

Since the at_exit hook waits for all child processes other than the Ruby process, it leads to the following problem in the test code of a real Rails application.

  1. Load the debug gem
  2. The capybara-playwright-driver starts Playwright as a child process
  3. The capybara-playwright-driver registers an at_exit hook to terminate Playwright when the test ends
  4. During test code execution, when a fork occurs, the debug gem registers the at_exit hook
  5. After all test cases have finished, the debug gem's at_exit hook executes first and waits for the child process to terminate, but since the at_exit hook to terminate Playwright does not execute, it continues to wait indefinitely

This can occur normally if the debug gem is required.
If it happens in a CI execution environment, it could result in unnecessary costs by holding computing resources for a long time.

I believe that waiting for all child processes(including not Ruby process) after a fork occurs is a significant issue.

To Reproduce

I described above.

Expected behavior

process finishes successfully.

Dominant language
Ruby
Stars
1.3k
Forks
146
PR merge metrics
No merged PRs in 30d

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from ruby/debug

All issues in ruby/debug

Similar issues

More Ruby issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.