Я получаю код ошибки выхода 0xc0000417 (который переводится как STATUS_INVALID_CRUNTIME_PARAMETER) в мой исполняемый файл (смешанный Fortran / C) и пытаюсь выяснить, что его вызывает. Кажется, это происходит при попытке записи в файл, который я определяю, потому что файл создан, но в нем ничего нет. И все же у меня есть подозрение, что это не настоящая причина. Когда я отключаю запись этого файла, что делается из кода C, происходит сбой при записи другого файла, на этот раз из кода Fortran.
Неудачная вещь: это происходит только после того, как программа (с высокой нагрузкой на ЦП) завершила работу после ~ 2-3 дней. Когда я попытался сократить время вычисления различными способами, чтобы облегчить отладку, проблема больше не возникала. Казалось, что длительное время работы было решающим для запуска проблемы.
Я попытался запустить его в Visual Studio 2015, но VS не ломается / не останавливается (как если бы, например, произошел segfault), несмотря на то, что он включал разрыв во всех исключениях C ++, как было предложено в каком-то другом потоке и во всех общих Исключения во время выполнения языка.
То, что я хотел бы сделать VS, это либо прерывать всякий раз, когда этот код ошибки «генерируется», и проверять значения переменных, либо, по крайней мере, получать трассировку стека.
Я интенсивно искал, но не смог найти удовлетворительного решения своей проблемы. По сути, мой вопрос похож на как отладить «Неверный параметр, переданный в функцию времени выполнения C»? , но проблема не возникает с версией моей программы для Linux, поэтому я ищу инструкции о том, как для отладки в Windows, либо с помощью Visual Studio, либо с помощью другого инструмента.
Изменить:
К сожалению, I не смог найти каких-либо удобных средств автоматического взлома при возникновении ошибки. Итак, я пошел с ручным способом установки точки останова (в VS) возле предполагаемого сбоя и прошел по коду.
Оказалось, что я получил нулевой указатель от fopen:
myfile = fopen("somedir\\somefile.xml");
несмотря на создаваемый файл. Но при попытке записи в этот файл (через дескриптор NULL!) Произошла ошибка. Как ни странно, кажется, что я получаю NULL-указатель из fopen только тогда, когда процесс имеет длительное время жизни. Но это оффтоп для этого вопроса.
Редактировать 2:
Проверка глобальной переменной errno
дала код ошибки 22, который снова переводится в недопустимый аргумент. Однако аргумент для fopen - , а не , недопустимый, как я проверил с помощью отладчика, и тот факт, что файл действительно создан правильно (с длиной 0 байтов). Теперь я думаю, что , этот код ошибки 22 просто вводит в заблуждение , потому что когда я проверяю (через часы в VS) $err, hr
, я получаю:
0x000005aa ERROR_NO_SYSTEM_RESOURCES : Insufficient system resources exist to complete the requested service.
Как упомянуто здесь , у меня достаточно места на жестком диске (1,4 ГБ), много свободной оперативной памяти (3,2 ГБ), и я боюсь, что это вызвано не моей программой, а чем-то неработающий дизайн обработки файлов в Windows (в Linux этого не происходит).
Редактировать 3: Хорошо, похоже, виновником является не сама Windows, а компилятор Intel Fortran, который я использую. Каждый раз, когда я делаю в моей программе отформатированные операторы записи, дескриптор Mutant (Windows говорит о мьютексе) пропускается. Используя WinDbg и !htrace -enable
, затем немного продвинувшись вперед, разбив и выпуская !htrace -diff
, вы получите множество этих обратных следов:
0x00000000777ca25a: ntdll!NtCreateMutant+0x000000000000000a
0x000007fefd54a1b7: KERNELBASE!CreateMutexExW+0x0000000000000057
0x000007fefd551d60: KERNELBASE!CreateMutexExA+0x0000000000000050
0x000007fedfab24db: libifcoremd!for_lge_ssll+0x0000000000001dcb
0x000007fedfb03ed6: libifcoremd!for_write_int_fmt+0x0000000000000056
0x000000014085aa21: myprog!MY_ROUTINE+0x0000000000000121
Во время выполнения программы эти мутантные дескрипторы накапливаются до тех пор, пока они не исчерпают все ресурсы дескрипторов (16711680 дескрипторов), так что для файловых дескрипторов ничего не останется.
Редактировать 4: Это ошибка в библиотеках времени исполнения Intel Fortran, которая была исправлена в более поздней версии (см. здесь ). Использование исправленной версии libifcoremd.dll
решает проблему, то есть количество дескрипторов больше не увеличивается во время форматированной записи.