ATL regular expression code adds dump/debug capabilities with ATL_REGEXP_DUMP preprocessor definition defined (undocumented). Dump output is directed to stdout, so if the application is not console, it has to be redirected in advance, e.g. into a $(BinaryPath)$(BinaryName)-atlrx.h file.
CAtlRegExp<> Expression; LPCTSTR pszPattern; BOOL bCaseSensitive;
#if defined(ATL_REGEXP_DUMP)
REParseError Error = Expression.Parse(pszPattern, bCaseSensitive);
if(Error != REPARSE_ERROR_OK)
{
FILE* pStream = NULL;
if(!GetStdHandle(STD_OUTPUT_HANDLE))
{
TCHAR pszPath[MAX_PATH] = { 0 };
ATLVERIFY(GetModuleFileName(_AtlBaseModule.GetModuleInstance(), pszPath, _countof(pszPath)));
RemoveExtension(pszPath); // ATLPath::
_tcscat_s(pszPath, _countof(pszPath), _T("-atlrx.txt"));
ATLVERIFY(freopen_s(&pStream, CStringA(pszPath), "w", stdout) == 0);
}
_tprintf(_T("Error %d\n"), Error);
Expression.Dump();
if(pStream)
ATLVERIFY(fclose(pStream) == 0);
ATLASSERT(FALSE); // Break into debugger
}
#else
ATLVERIFY(Expression.Parse(pszPattern, bCaseSensitive) == REPARSE_ERROR_OK);
#endif // defined(ATL_REGEXP_DUMP)
There is also ATLRX_DEBUG definition, which enables other debug capabilities. CAtlRegExp object is given a virtual function OnDebugEvent through which it prints comments on CAtlRegExp::Match process, which can be also redirected to file similar way.