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.