Сначала сформулируем цели проектирования TraceSrv, потому что это вообще лучший способ понять, что именно должна выполнять любая программа. Итак:
1. TraceSrv должна быть совместима с общими языками программирования, включая, как минимум, C++, Visual Basic, Borland Delphi, Visual Basic for Applications, Java, Jscript и VBScript.
2. TraceSrv должна быть очень проста для использования внутри языка программирования.
3. TraceSrv должна всегда выполняться так, чтобы любое приложение могло в любой момент соединяться с ней.
4. Операторы трассировки программы, которая выполняется на нескольких машинах, должны направлять свои результаты в один каталог (файл).
5. Приложения просмотра трасс (trace viewer applications) должны видеть строки трасс от нескольких машин одновременно.
6. Должны быть доступны следующие операции обработки необязательных параметров (опций) трассировочных строк:
• добавление (в строку трассировки) префикса со временем получения строки;
• добавление префикса с номером строки;
• добавление префикса с идентификатором (ID) процесса, который послал строку трассировки;
• добавление в конец записи трассы символов возврата каретки и перевода строки, если необходимо;
• посылать предложения трассировки через основной отладчик, где выполняется процесс TraceSrv.
7. Если хотя бы один из параметров TraceSrv, перечисленных в п. 6 изменяется, все активные программы просмотра трасс должны быть уведомлены, для того чтобы все эти программы (даже на других машинах) были скоординированы с текущими опциями.
На первый взгляд, требования к TraceSrv могут показаться чрезмерно завышенными из-за необходимости многоязычного программирования и работы в сети. Я предполагал, что можно переадресовать многоязычную поддержку простой динамически компонуемой библиотеке (DLL), которую мог бы загружать кто угодно. Поскольку я — прежде всего системный программист, а не Web-разработчик, то сказалось незнание языков VBScript и Java. В частности, при ближайшем знакомстве с VBScript я понял, что никакие хакер-ские трюки не заставят VBScript напрямую вызывать DLL.