cannot open output file, permission denied
От: cures Россия cures.narod.ru
Дата: 27.04.11 18:04
Оценка:
В седьмой винде (64-bit, Ultimate) появилась очень странная проблема: если после сборки и запуска программы (пользуюсь MinGW-TDM + CodeBlocks) что-то в ней изменить и снова попытаться её собрать, то линкер выдаёт следующую ошибку:
 ld.exe: cannot open output file r0.exe Permission denied

Программа при этом уже заведомо завершила своё выполнение (иначе CodeBlocks не даст её снова компилировать). То же самое происходит при компиляции из командной строки, хотя если задать другое имя для выходного экзешника, то всё работает. При этом в проводнике с помощью Shift-Del существующий экзешник тоже не удаляется, точнее он исчезает из списка, но если прорефрешить окно — он снова на месте. Это всё проходит само собой через пару минут, программа собирается, а если экзешник пытались удалить с помощью проводника, то он реально исчезает. Однако ждать пару минут для каждой простейшей модификации крайне утомительно. Причём, по ощущениям, после каждой неудачной попытки собрать программу, ждать приходится снова. К счастью, если проект лежит на флэшке или на самбе (под линуксом), то такого не происходит, только на родных (NTFS) хардах, неважно, примонтированных в буквы диска или к директории.
Сначала у меня стоял DrWeb, грешил на него, снёс начисто, не помогло. В гугле из разумных обсуждений нашёл только вот эту тему: http://www.blitzbasic.com/Community/posts.php?topic=82962 закончившуюся тем, что было обнаружено, что файлы лочатся процессом System.
Кто ещё с таким сталкивался и как боролся?
c++ windows 7
Re: cannot open output file, permission denied
От: Serg27  
Дата: 28.04.11 02:22
Оценка:
Здравствуйте, cures, Вы писали:

C>

C>Кто ещё с таким сталкивался и как боролся?
Найдите утилиту, которая показывает кто открыл/заблокировал файл с вашей программой. Посмотрите и потом делайте выводы...
Примеры утилит:
здесь
здесь
Re: cannot open output file, permission denied
От: Alex_Avr Россия  
Дата: 28.04.11 08:57
Оценка:
Попробуй Unlocker
С уважением, Александр Авраменко.
Re[2]: cannot open output file, permission denied
От: cures Россия cures.narod.ru
Дата: 28.04.11 12:24
Оценка:
S>Найдите утилиту, которая показывает кто открыл/заблокировал файл с вашей программой. Посмотрите и потом делайте выводы...

Русинович и Unlocker хандла в упор не видят, при этом Unlocker не может его удалить, LockHunter из эксплорера говорит, что всё чисто, а если ему задать этот файл в менюшке — обижается, что у меня не хватает прав, и рекомендует обратиться к владельцу или администратору, коими являюсь я
Может быть его надо пускать от имени System, но я уже забыл, как это делается.
Зато OFV (в тестовом режиме системы) таки хандл видит, говорит следующее:
==================================================
Filename          : r0.exe
Full Path         : \r0\r0.exe
Handle            : 0xcdc
Created Time      : N/A
Modified Time     : N/A
Attributes        : 
File Size         : 0
Read Access       : *
Write Access      : 
Delete Access     : 
Shared Read       : *
Shared Write      : 
Shared Delete     : *
Granted Access    : 0x00000080
File Position     : 0
Process ID        : 4
Process Name      : System Process
Process Path      : 
Extension         : exe
% Position        : 
==================================================

В том и засада, что лочит его какая-то часть системы (или может какой-то неудалившийся огрызок ДрВеба), зачем-то мусолит его несколько минут, потом выплёвывает.
Поверить в это, самому не натолкнувшись, очень сложно, поэтому везде в форумах и предлагают "закрыть программу".
Как копать дальше внутрь процесса System? Он состоит из многих тредов (их показывает ProcessHacker), но, насколько я знаю, нет понятия принадлежности хандла нити, только процессу? Я подозреваю нить MpFilter.sys, она якобы отвечает за безопасность.
Или может у меня завёлся какой-то станный руткит? Но зачем ему лочить экзешники? Причём лочить только после попытки запуска, если не запускать, то можно перекомпилировать сколько угодно.
Ещё один вариант — его кладут в какой-то кэш, на случай если вдруг начнут часто запускать. Тогда как такое отключать? Индексирование у меня отключено глобально.

На всякий случай привожу исходный текст программы:
int main() { return 0; }

Собирал и под 32-битный и под 64-битный режимы, всё едино.
Re: cannot open output file, permission denied
От: lollipop  
Дата: 28.04.11 12:53
Оценка:
Здравствуйте, cures, Вы писали:

C>Кто ещё с таким сталкивался и как боролся?


попробуй сменить режим отображения в папке (на табличный вид если он у тебя не стоит по дефолту) попробуй оставить одну ИДЕ шку закрыв в эксплорере окно с этой папкой.
Re[2]: cannot open output file, permission denied
От: cures Россия cures.narod.ru
Дата: 28.04.11 16:24
Оценка:
Здравствуйте, lollipop, Вы писали:

L> попробуй сменить режим отображения в папке (на табличный вид если он у тебя не стоит по дефолту) попробуй оставить одну ИДЕ шку закрыв в эксплорере окно с этой папкой.


По дефолту режим табличный, обычно я и работал в одной идешке, создавал новый проект и его пилил, а эксплорером туда не лазил. Это уже когда стало лочиться, начал разбираться. Кто-то глубже хватает, не эксплорер.
Re: cannot open output file, permission denied
От: cures Россия cures.narod.ru
Дата: 28.04.11 17:41
Оценка:
Замерил ProcessHacker-ом, хандл экзешника висит в процессе System ровно одну минуту (може плюс-минус секунду на ловкость рук). Так происходит не только с моим собственным экзешником, но и с любым (?) запускаемым, например, теми же ld.exe, as.exe, cb_console_runner.exe, при их запуске.
Неужели такое происходит только у меня, а у других разработка на седьмой винде идёт совершенно нормально?
Re[2]: cannot open output file, permission denied
От: vladtronko  
Дата: 28.04.11 19:20
Оценка:
Здравствуйте, cures, Вы писали:

C>Замерил ProcessHacker-ом, хандл экзешника висит в процессе System ровно одну минуту (може плюс-минус секунду на ловкость рук). Так происходит не только с моим собственным экзешником, но и с любым (?) запускаемым, например, теми же ld.exe, as.exe, cb_console_runner.exe, при их запуске.

C>Неужели такое происходит только у меня, а у других разработка на седьмой винде идёт совершенно нормально?

Похоже что глюк, завязанный на что-то долгоработающее. Мож опрос чего-то по сети с залоченным ехе-шником? Минута — на сетку похоже. У Марка Руссиновича что-то подобное проскакивало в "Деле о медленной презентации" кажись.
Re[3]: cannot open output file, permission denied
От: cures Россия cures.narod.ru
Дата: 29.04.11 15:06
Оценка:
Здравствуйте, vladtronko, Вы писали:

V>Похоже что глюк, завязанный на что-то долгоработающее. Мож опрос чего-то по сети с залоченным ехе-шником? Минута — на сетку похоже. У Марка Руссиновича что-то подобное проскакивало в "Деле о медленной презентации" кажись.


Нашёл, у нас перевели как "демонстрации". Там 72 секунды, настолько я вряд ли ошибся. И там подсистема дотнета тормозила, а у меня — обычные экзешники.
Зачем-то ядро тупо хватает хандл на них при их запуске, и отпускает через минуту.
Вот такое пишут в МСДН: If you call CreateFile on a file that is pending deletion as a result of a previous call to DeleteFile, the function fails. The operating system delays file deletion until all handles to the file are closed. GetLastError returns ERROR_ACCESS_DENIED.
Симптомы ровно эти, а хандл на файл принадлежит процессу System, в который Руссинович ходить не умеет.
Пробовал отключать DEP, не помогло. Где-то проскакивало, что Windows при удалении файла и быстром его создании кладёт его на время в какой-то кэш, может это оно, но тогда как уменьшать это время?
Re[4]: cannot open output file, permission denied
От: vladtronko  
Дата: 29.04.11 17:02
Оценка:
Здравствуйте, cures, Вы писали:

C>Нашёл, у нас перевели как "демонстрации". Там 72 секунды, настолько я вряд ли ошибся. И там подсистема дотнета тормозила, а у меня — обычные экзешники.

C>Зачем-то ядро тупо хватает хандл на них при их запуске, и отпускает через минуту.
C>Вот такое пишут в МСДН: If you call CreateFile on a file that is pending deletion as a result of a previous call to DeleteFile, the function fails. The operating system delays file deletion until all handles to the file are closed. GetLastError returns ERROR_ACCESS_DENIED.
C>Симптомы ровно эти, а хандл на файл принадлежит процессу System, в который Руссинович ходить не умеет.
C>Пробовал отключать DEP, не помогло. Где-то проскакивало, что Windows при удалении файла и быстром его создании кладёт его на время в какой-то кэш, может это оно, но тогда как уменьшать это время?

Предлагаю создать в корне диска (лучше не того где живет 7ка) средствами проводника от имени юзера директорию и настроить IDE чтобы собирать-компилить в нее.
Re[5]: cannot open output file, permission denied
От: cures Россия cures.narod.ru
Дата: 29.04.11 18:02
Оценка:
Здравствуйте, vladtronko, Вы писали:

V>Предлагаю создать в корне диска (лучше не того где живет 7ка) средствами проводника от имени юзера директорию и настроить IDE чтобы собирать-компилить в нее.


Именно так и сделал, выше в распечатке от OpenFilesView видно, что файл r0.exe живёт в папке r0, которая живёт в корне
Full Path : \r0\r0.exe
И это не тот раздел, на котором живёт семёрка, а специально зарезервированный на случай необходимости установки хрюши. Сегодня попробовал не только на NTFS-е, но и на VFAT-е, а кроме того — даже на другом физическом диске. Ничего не помогает
Интересно, что означает в распечатке маска Granted Access?

Пока самый разумный выход, который я вижу, — держать проекты на самбе. Это — решение, но кривоватое: для программирования в Windows 7 требуется Linux (или может быть достаточно Windows XP).
Re[6]: cannot open output file, permission denied
От: vladtronko  
Дата: 29.04.11 20:48
Оценка:
Здравствуйте, cures, Вы писали:

C>Здравствуйте, vladtronko, Вы писали:


V>>Предлагаю создать в корне диска (лучше не того где живет 7ка) средствами проводника от имени юзера директорию и настроить IDE чтобы собирать-компилить в нее.


C>Именно так и сделал, выше в распечатке от OpenFilesView видно, что файл r0.exe живёт в папке r0, которая живёт в корне

C>Full Path : \r0\r0.exe
C>И это не тот раздел, на котором живёт семёрка, а специально зарезервированный на случай необходимости установки хрюши. Сегодня попробовал не только на NTFS-е, но и на VFAT-е, а кроме того — даже на другом физическом диске. Ничего не помогает

Недоглядел.

C>Интересно, что означает в распечатке маска Granted Access?


Все эти Access-ы это (если я правильно понимаю) биты прав доступа записанные в дополнительных потоках NTFS.

C>Пока самый разумный выход, который я вижу, — держать проекты на самбе. Это — решение, но кривоватое: для программирования в Windows 7 требуется Linux (или может быть достаточно Windows XP).


Может с правами поиграться в свойствах папки? Равно как и со свойствами совместимости запуска IDE? Студия же ни 2008я ни 2010я таким не страдает — значит можно настроить работу и другой среды в 7ке. "Я так думаю" (с) Мимино
Re[3]: cannot open output file, permission denied
От: vladtronko  
Дата: 29.04.11 21:05
Оценка:
Здравствуйте, cures, Вы писали:


C>В том и засада, что лочит его какая-то часть системы (или может какой-то неудалившийся огрызок ДрВеба), зачем-то мусолит его несколько минут, потом выплёвывает.

C>Поверить в это, самому не натолкнувшись, очень сложно, поэтому везде в форумах и предлагают "закрыть программу".
C>Как копать дальше внутрь процесса System? Он состоит из многих тредов (их показывает ProcessHacker), но, насколько я знаю, нет понятия принадлежности хандла нити, только процессу? Я подозреваю нить MpFilter.sys, она якобы отвечает за безопасность.
C>Или может у меня завёлся какой-то станный руткит? Но зачем ему лочить экзешники? Причём лочить только после попытки запуска, если не запускать, то можно перекомпилировать сколько угодно.
C>Ещё один вариант — его кладут в какой-то кэш, на случай если вдруг начнут часто запускать. Тогда как такое отключать? Индексирование у меня отключено глобально.

Чисто из собственных наблюдений (без разбирательства) замечал что после определенного количества установок-удалений антивирей-файрволлов-антируткитов-etc и после многократных отключений-включений UAC, DEP, индексации и прочего — систему потом не удается вернуть в предыдущее состояние никак. Думается из-за модификации реестра (который как после такого руками править — чаще в разы быстрее ОСь вчистую переставить) и модификации-подмены библиотек и прочего системного файлА. Находятся модифицированные .dll, .lib, .sys и прочие файлы. Не говоря за "распухание" директории :\windows\winsxs

Пробовал реестр зачистить RegOrganizer-ом — 1 случай из 4х выравнивается работа. В остальных случаях — WindowsWay. Т.е. format c: /u А то и вообще удаление раздела и создание нового.

Потому более чем все обновления с сайта микрософта на рабочую машину ничего защитно-файрволльного не ставлю. Ибо глюконат софта в итоге почти гарантирован.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.