Здравствуйте, LaptevVV, Вы писали:
LVV>>>1. Явно падает по неправильному указателю. Скорее всего нулевой. У>>С чего такой вывод? Ну, и код я привел, можно пальцем ткнуть, где там получается неправильный указатель? LVV>Вывод из опыта.
Ну, вообще-то, когда падает по нулевому указателю, там SEH исключение кидается, которое студия (или система, если не из под студии) ловит и вполне внятно показывает
LVV>Каким компилятором компилил?
MSVC2019/C++17
LVV>>>2. В С++17 есть уже файловая система, и там уже есть что-то вроде exist() для файла. У>>Угу, только между тем моментом, когда я проверил существование файла, и тем моментом, когда я его создал — кто-то другой может захотеть сделать тоже самое, и никто ему и слова не скажет LVV>Дык в твоем коде это может случится в любом месте между любых двух строк кода.
Это как? Так-то fopen должна, как я понимаю, атомарно это делать
У>Invalid parameter detected in function (null). File: (null) Line: 0
У>Expression: (null)
У>Что-то не особо понятнее стало
Да, в релизном рантайме нет этой информации.
Но можно ведь посмотреть колл стэк откуда туда попали.
Точку останова поставить и отдалчиком посмотреть.
(Без отладчика -- напечатать через какой-нибудь boost::stacktrace или аналог, но продуктивнее таки с отладчиком)
Русский военный корабль идёт ко дну!
Re[2]: std::fopen падает в релизе с ошибкой 0xc0000417
Здравствуйте, ArtDenis, Вы писали:
AD>Я конечно может туплю, но если воспроизводится в отладчике, в чём проблема посмотреть где именно вылетает и какая причина вылета потока? Callstack и значения аргументов функций в точке падения должны же быть видны, а отладчик должен встать на место падения, (если не настроен пропуск таких исключений)
Я наверно тоже туплю, но попытка пройти эту строчку по F10/F11 молча завершает программу.
Уже подсказали — вызывается _invalid_parameter_handler, который, скорее всего, вызывает abort. Так что исключений никаких нет. А при запуске из системы (без студии) — винда выдаёт окошко с сообщением об ошибке. Или это делает рантайм, я хз
Re[4]: std::fopen падает в релизе с ошибкой 0xc0000417
Здравствуйте, Alexander G, Вы писали: AG>Да, в релизном рантайме нет этой информации. AG>Но можно ведь посмотреть колл стэк откуда туда попали. AG>Точку останова поставить и отдалчиком посмотреть. AG>(Без отладчика -- напечатать через какой-нибудь boost::stacktrace или аналог, но продуктивнее таки с отладчиком)
Там очень информативно
Ну, показывает либо на строчку в main, где fopen вызывается, либо на мой обработчик
Re[5]: std::fopen падает в релизе с ошибкой 0xc0000417
Надо выключить Options > Debugging > General > [ ] Enable Just My Code.
Ещё могут исходинки не подхватываться, стандартная проблема из-за того, что DLLки рантайма обновляются, если есть возможность, лучше всего изучить проблему с /MT, а не /MD; иначе — насильно загружать исходники, даже если чексумма не совпадает, расхождения обычно небольшие.
Русский военный корабль идёт ко дну!
Re[6]: std::fopen падает в релизе с ошибкой 0xc0000417
Здравствуйте, 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
Здравствуйте, удусекшл, Вы писали:
У>Я наверно тоже туплю, но попытка пройти эту строчку по F10/F11 молча завершает программу. У>Уже подсказали — вызывается _invalid_parameter_handler, который, скорее всего, вызывает abort. Так что исключений никаких нет. А при запуске из системы (без студии) — винда выдаёт окошко с сообщением об ошибке. Или это делает рантайм, я хз
int main()
{
abort();
}
Прекрасно отлаживается в релизе. А иначе нафига нужен такой отладчик, который такие вещи не ловит?
У>>Уже подсказали — вызывается _invalid_parameter_handler, который, скорее всего, вызывает abort. Так что исключений никаких нет. А при запуске из системы (без студии) — винда выдаёт окошко с сообщением об ошибке. Или это делает рантайм, я хз
AD>
AD>int main()
AD>{
AD> abort();
AD>}
AD>
AD>Прекрасно отлаживается в релизе. А иначе нафига нужен такой отладчик, который такие вещи не ловит?
Ну, когда я подменил _invalid_parameter_handler и поставил там бряк, то да, он там останавливается
Re[5]: std::fopen падает в релизе с ошибкой 0xc0000417
Здравствуйте, удусекшл, Вы писали:
У>Ну, когда я подменил _invalid_parameter_handler и поставил там бряк, то да, он там останавливается
Ну понятно, что он там остановится, если ты его переопределишь. Лучше разберись с отладчиком. С ним гораздо проще будет такие вещи и отлавливать и отлаживать. Где-то у тебя запрет стоит на останов в отладчике по таким событиям
Здравствуйте, ArtDenis, Вы писали:
У>>Ну, когда я подменил _invalid_parameter_handler и поставил там бряк, то да, он там останавливается
AD>Ну понятно, что он там остановится, если ты его переопределишь. Лучше разберись с отладчиком. С ним гораздо проще будет такие вещи и отлавливать и отлаживать. Где-то у тебя запрет стоит на останов в отладчике по таким событиям
По каким событиям? Это не SEH исключение, это не плюсовое исключение, это вызов функции рантайма, которая просто завершает процесс
Re[7]: std::fopen падает в релизе с ошибкой 0xc0000417
Здравствуйте, удусекшл, Вы писали:
У>По каким событиям? Это не SEH исключение, это не плюсовое исключение, это вызов функции рантайма, которая просто завершает процесс
Ну так у тебя просто на abort() в main отладчик реагирует при отладке релизного билда?
Здравствуйте, ArtDenis, Вы писали:
У>>По каким событиям? Это не SEH исключение, это не плюсовое исключение, это вызов функции рантайма, которая просто завершает процесс
AD>Ну так у тебя просто на abort() в main отладчик реагирует при отладке релизного билда?
Реагирует.
Видимо, там не abort, а что-то другое вызывается
Re[7]: std::fopen падает в релизе с ошибкой 0xc0000417
Здравствуйте, удусекшл, Вы писали:
У> __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
(путь может отличаться в зависимости от версии студии и архитектуры процессора/разрядности)
Здравствуйте, удусекшл, Вы писали:
У>Я ручками открыл файл, в котором нашел __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. (Да, сейчас рантайм из двух частей состоит)
Здравствуйте, 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
Здравствуйте, 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
Здравствуйте, удусекшл, Вы писали:
У>ЗЫ А как таки заставить отладчик видеть сорцы? На странице "No source available" предлагается только дизасм, а вроде раньше было, что можно было ручками промотать до исходника в диалоге "Open file"
Может даже так быть, что и никак . Т.к. universal CRT как бы компонент ОС, а не Студии, .pdb может быть stripped, как обычно для компонентов Windows, т.е. без ссылок на исходник.
Приходится использовать /MT или дебаг для нормальной отладки (в случае проблем не вызванных именно /MD).
Ну а с этой проблемой исходники всё равно вряд ли полезны, раз проблема именно в том, что DLL не та.
Русский военный корабль идёт ко дну!
Re[10]: std::fopen падает в релизе с ошибкой 0xc0000417
Здравствуйте, Alexander G, Вы писали:
AG>Может даже так быть, что и никак . Т.к. universal CRT как бы компонент ОС, а не Студии, .pdb может быть stripped, как обычно для компонентов Windows, т.е. без ссылок на исходник. AG>Приходится использовать /MT или дебаг для нормальной отладки (в случае проблем не вызванных именно /MD).
AG>Ну а с этой проблемой исходники всё равно вряд ли полезны, раз проблема именно в том, что DLL не та.
Да, винда у меня 7ка, и исходно там скорее всего C++17 не поддерживается. Но вообще имхо так себе поведение. Можно же вернуть 0 и установить errno во что-то типа EINVALIDPARAM