﻿# Ctrl\+S и Visual Studio Output Window

Один из пользователей PVS\-Studio прислал нам bug report\.

```cpp
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 на такие ситуации\.