I'm embarrassed to admit that I didn't know about code coverage tools until about Year 10 of my career, mostly embedded C and C++ where things seem to move slowly with regards to adapting modern best practices.
There is actually code coverage support built into GCC, called gcov. It works really well for C and C++ projects (and theoretically any language with a GCC frontend?)