Bisecting regressions
Bisecting is a way to find regressions in software. After reporting a bug on the Redot repository on GitHub, you may be asked by a contributor to bisect the issue. Bisecting makes it possible for contributors to fix bugs faster, as they can know in advance which commit caused the regression. Your effort will be widely appreciated :)
The guide below explains how to find a regression by bisecting.
What is bisecting?
Redot developers use the Git version control system. In the context of Git, bisecting is the process of performing a manual binary search to determine when a regression appeared. While it's typically used for bugs, it can also be used to find other kinds of unexpected changes such as performance regressions.
Using official builds to speed up bisecting
Before using Git's bisect command, we strongly recommend trying to reproduce
the bug with an older (or newer) official release. This greatly reduces the
range of commits that potentially need to be built from source and tested.
You can find binaries of official releases, as well as alphas, betas,
and release candidates here.
If you have experience with Godot 4.x and can reproduce an issue with Redot 26.x, we recommend trying to reproduce the issue in the latest Godot 4.x version (if the feature exhibiting the bug is present in 4.x). This can be used to check whether the issue is a regression in 26.x or not.
- If the issue is present in 26.x, then you'll need to check whether the issue occurs in older 26.x versions as well.
- If the issue is not present in 26.x, then you can try older 26.x alphas and betas to determine when the regression started.
The Git bisect command
If you've found a build that didn't exhibit the bug in the above testing
process, you can now start bisecting the regression. The Git version control
system offers a built-in command for this: git bisect. This makes the
process semi-automated as you only have to build the engine, run it and try to
reproduce the bug.
Determine the commit hashes
To start bisecting, you must first determine the commit hashes (identifiers) of
the "bad" and "good" build. "bad" refers to the build that exhibits the bug,
whereas "good" refers to the version that doesn't exhibit the bug. If you're
using a pre-release build as the "good" or "bad" build, browse the
download mirror, go to
the folder that contains the pre-release you downloaded and look for the
README.txt file. The commit hash is written inside that file.
If you're using a stable release as the "good" or "bad" build, use one of the following commit hashes depending on the version:
4.3-stable
4.3.1-stable
4.4-stable
26.1-stable
26.2-stable
To refer to the latest state of the master branch, you can use master
instead of a commit hash. Note that unlike tagged releases or snapshot commit
hashes, master is a perpetually moving target.
Build the engine
Get Redot's source code using Git. Once this
is done, in the terminal window, use cd to reach the Redot repository
folder and enter the following command:
# <good commit hash> is hash of the build that works as expected.
# <bad commit hash> is hash of the build exhibiting the bug.
git bisect start
git bisect good <good commit hash>
git bisect bad <bad commit hash>
Compile Redot. This assumes you've set up a build environment:
scons
Run the engine
Run the binary located in the bin/ folder and try to reproduce the bug.
If the build still exhibits the bug, run the following command:
git bisect bad
If the build does not exhibit the bug, run the following command:
git bisect good
After entering one of the commands above, Git will switch to a different commit.
You should now build Redot again, try to reproduce the bug, then enter git bisect good or git bisect bad depending on the result. You'll have to
repeat this several times. The longer the commit range, the more steps will be
required. 5 to 10 steps are usually sufficient to find most regressions; Git
will remind you of the number of steps remaining (in the worst case scenario).
Once you've completed enough steps, Git will display the commit hash where the regression appeared. Write this commit hash as a comment to the GitHub issue you've bisected. This will help in solving the issue. Thanks again for contributing to Redot :)