Один из пользователей PVS-Studio прислал нам bug report.
Exception message:
The system cannot find the file specified.
Exception from HRESULT: 0x80070002)
Stack:
EnvDTE.TextPoint get_StartPoint() at (0).
Void BuildEvents_OnBuildDone(EnvDTE.vsBuildScope,
EnvDTE.vsBuildAction)
at C:\Users\evg\Documents\SVN\CCnetBuild\
Local PVS-Studio Setup\WorkDir\PVS-Studio\
PVS-Studio\VsPkg.cs(939).
Исследование кода показало, что падение происходит в тот момент, когда мы пытаемся получить текст из Output Window среды Visual Studio (это происходит после завершения сборки и перед запуском инкрементального анализа, т.к. нам необходимо убедиться в отсутствии ошибок линковки). При этом указатель на само окно вывода был корректно получен, а ошибка проявлялась в том месте, где мы получали указатель на первый символ в тексте.
В данной ситуации странным выглядит само сообщение "The system cannot find the file specified", так как ни мы, ни Output Window, никак не взаимодействуем и не связаны с какими либо файлами, а все операции над окном вывода производятся при помощи Visual Studio API из, казалось бы, безопасного managed C# кода. И в самом деле, судя по полученному стеку, исключение возникает в unmanaged внутренностях Visual Studio. И, конечно же, данная ошибка не повторялась и не ловилась ни одним нашим внутренним тестом.
Учитывая всё вышесказанное, стало ясно, что для воспроизводства ошибки необходимо установить, как именно Output Window студии может быть связано с каким либо внешним файлом. После пары часов копания в настройках Visual Studio, попыток отключить сохранение логов сборки в html файлы, совсем отключить это окно вывода, найти связь выводимого теста с системными временными файлами (ничто из этого не смогло повторить баг, напротив, наш код работал безошибочно), совершенно случайно была открыта, наверное, не самая широко известная возможность Output Window — сохранение всего выведенного текста в файл по нажатию Ctrl+S. Стоит отметить, что это действие не синхронизирует вывод окна с таким файлом, а просто единично сохраняет в него весь вывод, без последующего обновления. И, тем не менее, именно это внезапно и позволило повторить интересующее нас исключение.
Таким образом, мы видим явный баг в extensibility модели API Visual Studio — единичное сохранение вывода из Output Window в файл приводит к неработоспособности методов взаимодействия с текстом данного окна. В PVS-Studio 3.45 появился workaround на такие ситуации.