Как я могу отладить причину 0xc0000417 код выхода - PullRequest
1 голос
/ 13 марта 2019

Я получаю код ошибки выхода 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 решает проблему, то есть количество дескрипторов больше не увеличивается во время форматированной записи.

1 Ответ

0 голосов
/ 22 марта 2019

Это может быть слишком много открытых файлов или утечек (не закрытых) дескрипторов. Вы можете проверить это, например, Process Explorer (я думаю, вы могли видеть количество дескрипторов в процессе с ним).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...