Posting this in case anyone else has this problem.
I have several build targets (DEBUG, RELEASE, etc). When launching the debugger, it would always build and load the DEBUG target. Changing the target name (e.g. to DEVELOPMENT) didn't help, the debugger would still launch the same configuration. After many hours of reading documentation, searching the forums... I deleted the DEBUG build target. This caused things to work as expected: the build target selected in the C/C++ perspective is the target that gets launched in the debugger. I then added the DEBUG configuration back and things are still working as expected.
It would be nice to know the root cause, but at least it is working now.