Concatenate all the source code files into a single file, with pathnames inserted between files.
Then use Vim to read the concatenation and (regexp) search.
Then use Vim to read the concatenation and (regexp) search.
I use Vim on a concatenation. It's a simple technique that allows me to search, read, annotate, and understand how everything fits together in a medium sized C++ codebase full of templates (i.e., a pile of garbage).