Re[4]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 10:28
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>>>1. Явно падает по неправильному указателю. Скорее всего нулевой.

У>>С чего такой вывод? Ну, и код я привел, можно пальцем ткнуть, где там получается неправильный указатель?
LVV>Вывод из опыта.

Ну, вообще-то, когда падает по нулевому указателю, там SEH исключение кидается, которое студия (или система, если не из под студии) ловит и вполне внятно показывает


LVV>Каким компилятором компилил?


MSVC2019/C++17


LVV>>>2. В С++17 есть уже файловая система, и там уже есть что-то вроде exist() для файла.

У>>Угу, только между тем моментом, когда я проверил существование файла, и тем моментом, когда я его создал — кто-то другой может захотеть сделать тоже самое, и никто ему и слова не скажет
LVV>Дык в твоем коде это может случится в любом месте между любых двух строк кода.

Это как? Так-то fopen должна, как я понимаю, атомарно это делать


LVV>И с чего там у тебя "wx" ?

LVV>https://ru.cppreference.com/w/c/io/fopen
LVV>тут икса нет ни разу.

Не туда смотришь — https://en.cppreference.com/w/cpp/io/c/fopen
Re[3]: std::fopen падает в релизе с ошибкой 0xc0000417
От: Alexander G Украина  
Дата: 04.02.22 10:30
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>печатает

У>

У>Invalid parameter detected in function (null). File: (null) Line: 0
У>Expression: (null)


У>Что-то не особо понятнее стало


Да, в релизном рантайме нет этой информации.
Но можно ведь посмотреть колл стэк откуда туда попали.

Точку останова поставить и отдалчиком посмотреть.
(Без отладчика -- напечатать через какой-нибудь boost::stacktrace или аналог, но продуктивнее таки с отладчиком)
Русский военный корабль идёт ко дну!
Re[2]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 10:30
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Я конечно может туплю, но если воспроизводится в отладчике, в чём проблема посмотреть где именно вылетает и какая причина вылета потока? Callstack и значения аргументов функций в точке падения должны же быть видны, а отладчик должен встать на место падения, (если не настроен пропуск таких исключений)


Я наверно тоже туплю, но попытка пройти эту строчку по F10/F11 молча завершает программу.

Уже подсказали — вызывается _invalid_parameter_handler, который, скорее всего, вызывает abort. Так что исключений никаких нет. А при запуске из системы (без студии) — винда выдаёт окошко с сообщением об ошибке. Или это делает рантайм, я хз
Re[4]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 10:41
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Да, в релизном рантайме нет этой информации.

AG>Но можно ведь посмотреть колл стэк откуда туда попали.

AG>Точку останова поставить и отдалчиком посмотреть.

AG>(Без отладчика -- напечатать через какой-нибудь boost::stacktrace или аналог, но продуктивнее таки с отладчиком)

  Там очень информативно

Ну, показывает либо на строчку в main, где fopen вызывается, либо на мой обработчик
Re[5]: std::fopen падает в релизе с ошибкой 0xc0000417
От: Alexander G Украина  
Дата: 04.02.22 10:46
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>http://files.rsdn.org/138407/2022_01_05_13_40_03_image.png]Image: 2022_01_05_13_40_03_image.png

У>Ну, показывает либо на строчку в main, где fopen вызывается, либо на мой обработчик

Надо выключить Options > Debugging > General > [ ] Enable Just My Code.

Ещё могут исходинки не подхватываться, стандартная проблема из-за того, что DLLки рантайма обновляются, если есть возможность, лучше всего изучить проблему с /MT, а не /MD; иначе — насильно загружать исходники, даже если чексумма не совпадает, расхождения обычно небольшие.
Русский военный корабль идёт ко дну!
Re[6]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 11:55
Оценка:
Здравствуйте, Alexander G, Вы писали:

У>>http://files.rsdn.org/138407/2022_01_05_13_40_03_image.png]Image: 2022_01_05_13_40_03_image.png

У>>Ну, показывает либо на строчку в main, где fopen вызывается, либо на мой обработчик

AG>Надо выключить Options > Debugging > General > [ ] Enable Just My Code.


Да, спасибо, стало поподробнее


AG>Ещё могут исходинки не подхватываться, стандартная проблема из-за того, что DLLки рантайма обновляются, если есть возможность, лучше всего изучить проблему с /MT, а не /MD; иначе — насильно загружать исходники, даже если чексумма не совпадает, расхождения обычно небольшие.


Я ручками открыл файл, в котором нашел __acrt_stdio_parse_mode — C:\Program Files (x86)\Windows Kits\10\Source\10.0.19041.0\ucrt\inc\corecrt_internal_stdio.h — но студия всё равно только дизасм показывает


Пересобрал с /MT — не падает, работает как надо. Это конечно здорово, но таки хочется понять, где был косяк. Без опции "x" — работает и с /MD, видимо, MSVCшный dll рантайм косячный
Re[3]: std::fopen падает в релизе с ошибкой 0xc0000417
От: ArtDenis Россия  
Дата: 04.02.22 11:56
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Я наверно тоже туплю, но попытка пройти эту строчку по F10/F11 молча завершает программу.

У>Уже подсказали — вызывается _invalid_parameter_handler, который, скорее всего, вызывает abort. Так что исключений никаких нет. А при запуске из системы (без студии) — винда выдаёт окошко с сообщением об ошибке. Или это делает рантайм, я хз

int main()
{
    abort();
}


Прекрасно отлаживается в релизе. А иначе нафига нужен такой отладчик, который такие вещи не ловит?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[4]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 11:57
Оценка:
Здравствуйте, ArtDenis, Вы писали:


У>>Уже подсказали — вызывается _invalid_parameter_handler, который, скорее всего, вызывает abort. Так что исключений никаких нет. А при запуске из системы (без студии) — винда выдаёт окошко с сообщением об ошибке. Или это делает рантайм, я хз


AD>
AD>int main()
AD>{
AD>    abort();
AD>}
AD>


AD>Прекрасно отлаживается в релизе. А иначе нафига нужен такой отладчик, который такие вещи не ловит?



Ну, когда я подменил _invalid_parameter_handler и поставил там бряк, то да, он там останавливается
Re[5]: std::fopen падает в релизе с ошибкой 0xc0000417
От: ArtDenis Россия  
Дата: 04.02.22 11:59
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Ну, когда я подменил _invalid_parameter_handler и поставил там бряк, то да, он там останавливается


Ну понятно, что он там остановится, если ты его переопределишь. Лучше разберись с отладчиком. С ним гораздо проще будет такие вещи и отлавливать и отлаживать. Где-то у тебя запрет стоит на останов в отладчике по таким событиям
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[6]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 12:03
Оценка:
Здравствуйте, ArtDenis, Вы писали:

У>>Ну, когда я подменил _invalid_parameter_handler и поставил там бряк, то да, он там останавливается


AD>Ну понятно, что он там остановится, если ты его переопределишь. Лучше разберись с отладчиком. С ним гораздо проще будет такие вещи и отлавливать и отлаживать. Где-то у тебя запрет стоит на останов в отладчике по таким событиям


По каким событиям? Это не SEH исключение, это не плюсовое исключение, это вызов функции рантайма, которая просто завершает процесс
Re[7]: std::fopen падает в релизе с ошибкой 0xc0000417
От: ArtDenis Россия  
Дата: 04.02.22 12:10
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>По каким событиям? Это не SEH исключение, это не плюсовое исключение, это вызов функции рантайма, которая просто завершает процесс


Ну так у тебя просто на abort() в main отладчик реагирует при отладке релизного билда?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[8]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 12:16
Оценка:
Здравствуйте, ArtDenis, Вы писали:

У>>По каким событиям? Это не SEH исключение, это не плюсовое исключение, это вызов функции рантайма, которая просто завершает процесс


AD>Ну так у тебя просто на abort() в main отладчик реагирует при отладке релизного билда?


Реагирует.
Видимо, там не abort, а что-то другое вызывается
Re[7]: std::fopen падает в релизе с ошибкой 0xc0000417
От: Alexander G Украина  
Дата: 04.02.22 12:23
Оценка:
Здравствуйте, удусекшл, Вы писали:

У> __acrt_stdio_parse_mode — C:\Program Files (x86)\Windows Kits\10\Source\10.0.19041.0\ucrt\inc\corecrt_internal_stdio.h


У>Пересобрал с /MT — не падает, работает как надо. Это конечно здорово, но таки хочется понять, где был косяк. Без опции "x" — работает и с /MD, видимо, MSVCшный dll рантайм косячный


Это интересная подробность. Похоже, что откуда-то взялась таки старая DLLка, в которой ещё не было "x"
Глянуть в окне call stack, в какой именно DLLке падающая __acrt_stdio_parse_mode, и в окне modules -- полную версию и полный путь.

Попробовать подложить рядом с приложением правильные DLLки из
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Redist\MSVC\14.29.30133\x64\Microsoft.VC142.CRT
(путь может отличаться в зависимости от версии студии и архитектуры процессора/разрядности)
Русский военный корабль идёт ко дну!
Отредактировано 04.02.2022 12:34 Alexander G . Предыдущая версия .
Re[7]: std::fopen падает в релизе с ошибкой 0xc0000417
От: Alexander G Украина  
Дата: 04.02.22 12:43
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Я ручками открыл файл, в котором нашел __acrt_stdio_parse_mode — C:\Program Files (x86)\Windows Kits\10\Source\10.0.19041.0\ucrt\inc\corecrt_internal_stdio.h — но студия всё равно только дизасм показывает


Ага, похоже, что оно внутри universal CRT, а не VC runtime. Которая ucrtbase.dll. (Да, сейчас рантайм из двух частей состоит)

См тут инструкции по обновлению https://docs.microsoft.com/en-us/cpp/windows/universal-crt-deployment?view=msvc-170
Русский военный корабль идёт ко дну!
Re[8]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 12:49
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Это интересная подробность. Похоже, что откуда-то взялась таки старая DLLка, в которой ещё не было "x"

AG>Глянуть в окне call stack, в какой именно DLLке падающая __acrt_stdio_parse_mode, и в окне modules -- полную версию и полный путь.

Функция лежит в C:\Windows\System32\ucrtbase.dll
Я так понимаю, что это просто какой-то прокси, не?
А само всё лежит в C:\Windows\System32\api-ms-win-crt-stdio-l1-1-0.dll


AG>Попробовать подложить рядом с приложением правильные DLLки из

AG>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Redist\MSVC\14.29.30133\x64\Microsoft.VC142.CRT
AG>(путь может отличаться в зависимости от версии студии и архитектуры процессора/разрядности)

Примерно там и лежит, с учётом того, что у меня Community

Не помогло

Ну, и там, кстати, никакой ucrtbase.dll нет
Re[8]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 12:52
Оценка:
Здравствуйте, Alexander G, Вы писали:

У>>Я ручками открыл файл, в котором нашел __acrt_stdio_parse_mode — C:\Program Files (x86)\Windows Kits\10\Source\10.0.19041.0\ucrt\inc\corecrt_internal_stdio.h — но студия всё равно только дизасм показывает


AG>Ага, похоже, что оно внутри universal CRT, а не VC runtime. Которая ucrtbase.dll. (Да, сейчас рантайм из двух частей состоит)


AG>См тут инструкции по обновлению https://docs.microsoft.com/en-us/cpp/windows/universal-crt-deployment?view=msvc-170


Спс, гляну.

ЗЫ А как таки заставить отладчик видеть сорцы? На странице "No source available" предлагается только дизасм, а вроде раньше было, что можно было ручками промотать до исходника в диалоге "Open file"
Re[9]: std::fopen падает в релизе с ошибкой 0xc0000417
От: Alexander G Украина  
Дата: 04.02.22 12:55
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Функция лежит в C:\Windows\System32\ucrtbase.dll

У>Я так понимаю, что это просто какой-то прокси, не?

Да, это не C Runtime, а Universal CRT — та часть рантайма, которую начиная с VS 2015 вынесли из Visual Studio в Platform SDK.

Правильные DLLки примерно здесь

C:\Program Files (x86)\Windows Kits\10\Redist\10.0.19041.0\ucrt\DLLs\x64


У>А само всё лежит в C:\Windows\System32\api-ms-win-crt-stdio-l1-1-0.dll


Нет, настоящая как раз ucrtbase.dll, а api-ms-win-что-то-там — это API set forwarders.
Русский военный корабль идёт ко дну!
Re[9]: std::fopen падает в релизе с ошибкой 0xc0000417
От: Alexander G Украина  
Дата: 04.02.22 13:03
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>ЗЫ А как таки заставить отладчик видеть сорцы? На странице "No source available" предлагается только дизасм, а вроде раньше было, что можно было ручками промотать до исходника в диалоге "Open file"


Может даже так быть, что и никак . Т.к. universal CRT как бы компонент ОС, а не Студии, .pdb может быть stripped, как обычно для компонентов Windows, т.е. без ссылок на исходник.
Приходится использовать /MT или дебаг для нормальной отладки (в случае проблем не вызванных именно /MD).

Ну а с этой проблемой исходники всё равно вряд ли полезны, раз проблема именно в том, что DLL не та.
Русский военный корабль идёт ко дну!
Re[10]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 13:13
Оценка:
Здравствуйте, Alexander G, Вы писали:


AG>Правильные DLLки примерно здесь


AG>C:\Program Files (x86)\Windows Kits\10\Redist\10.0.19041.0\ucrt\DLLs\x64


С ними — работает нормально

  Системная нерабочая ucrtbase.dll
  Рабочая
Re[10]: std::fopen падает в релизе с ошибкой 0xc0000417
От: удусекшл  
Дата: 04.02.22 13:17
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Может даже так быть, что и никак . Т.к. universal CRT как бы компонент ОС, а не Студии, .pdb может быть stripped, как обычно для компонентов Windows, т.е. без ссылок на исходник.

AG>Приходится использовать /MT или дебаг для нормальной отладки (в случае проблем не вызванных именно /MD).

AG>Ну а с этой проблемой исходники всё равно вряд ли полезны, раз проблема именно в том, что DLL не та.


Да, винда у меня 7ка, и исходно там скорее всего C++17 не поддерживается. Но вообще имхо так себе поведение. Можно же вернуть 0 и установить errno во что-то типа EINVALIDPARAM
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.