Sysdeps unix sysv linux raise c no such file or directory

отладка c ++: ../nptl/sysdeps/unix/sysv/linux/raise.c: нет такого файла или каталога

Я использую gdb для отладки программы C++ . В строке

  • значение параметра prevId 0 ;
  • метод GetTagIdFromState(maxState) return 50 ;

при отладке я получаю следующие ошибки.

3 ответа

Ваше приложение работает по назначению. Утверждение терпит неудачу (поскольку значения, которые вы передаете ему, не равны, макрос assert принимает 0), и, следовательно, ваша программа прерывается. Это как утверждает работу:

Если NDEBUG не определен, то assert проверяет, имеет ли его аргумент (который должен иметь скалярный тип) сравнивается с равным нулю. Если это так, утверждают выводит специфическую для конкретного проекта диагностическую информацию по стандарту выход ошибки и вызовы std:: abort.

Отметьте эту ссылку для подтверждения для получения дополнительной информации.

Я просто столкнулся с этой ошибкой, пытаясь отладить программу на малине Pi. Программа использует GPIO таким образом, чтобы программа выполнялась как root. Например, я запускаю программу, которую я написал следующим образом:

Я забыл это, однако, при запуске отладчика и попробовал

И я получил ошибку, с которой вы, похоже, столкнулись:

Когда я запускал его с помощью sudo, он работал нормально.

Надеюсь, что это поможет кому-то в одной лодке.

Это должно привести к ускорению использования функции assert

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

Специфичность отображаемого сообщения зависит от конкретной реализации в компиляторе, но она должна включать: выражение, утверждение которого не удалось, имя исходного файла и номер строки, в которой оно произошло. Обычный формат выражения:

Утверждение не выполнено: выражение, имя файла файла, номер строки Этот макрос отключен, если в момент включения assert.h уже определен макрос с именем NDEBUG. Это позволяет кодеру включать многие вызовы assert в исходный код при отладке программы, а затем отключить все из них для производственной версии, просто включив строку, например:

Таким образом, этот макрос предназначен для захвата ошибок программирования, а не ошибок пользователя или запусков, поскольку он обычно отключается после того, как программа выходит из фазы отладки. от: С++ Ref

Читайте также:  Замкнутая программная среда для linux

Источник

Ошибка сегментации Python, ../sysdeps/unix/sysv/linux/raise.c: Нет такого файла или каталога

Я создал один исполняемый файл моего приложения с графическим интерфейсом с помощью PyInstaller. Все выглядит нормально, исполняемый файл создается и запускается. Сначала страница входа отображается правильно, но после ввода имени пользователя и пароля программа вылетает. Я попытался выполнить отладку с помощью gdb, и вот что у меня получилось:

Может кто-нибудь объяснить, что это значит и как решить?

Код страницы входа:

ИЗМЕНИТЬ

После выполнения инструкций по этой ссылке GDB жалуется на отсутствие файла raise.c ( как было предложено @AliIrani), сообщение, которое я изменяю:

2 ответа

Похоже, проблема была вызвана библиотекой darkdetect . Ошибка возникла только во время выполнения, потому что после

Создается новое окно, а цвет фона зависит от выбранной пользователем системной темы (и, возможно, мой код не авторизован для доступа к такой информации).

Может кто-нибудь объяснить, что это значит и как решить?

Это означает, что исполняемый файл python обнаружил некоторую фатальную ошибку и вызвал abort() . Обычно это происходит при нарушении assert иона и сопровождается сообщением об ошибке на stderr .

К сожалению, ваше приложение-установщик полностью вырезано (что не позволяет GDB сообщить вам, где происходит сбой) или упаковано с помощью UPX .

Согласно этому документу PyInstaller, вы захотите использовать —noupx флаг (и удалите -s или —strip , если вы их используете).

Если приложение по-прежнему аварийно завершает работу, будет легче определить где этот сбой.

Источник

gdb — отладка c ++: ../nptl/sysdeps/unix/sysv/linux/raise.c: такого файла или каталога нет

я использую gdb отладить C++ программа. В соответствии

  • параметр prevId значение 0 ;
  • метод GetTagIdFromState(maxState) return s 50 ;

при отладке этого я получаю следующие ошибки.

Решение

Ваше приложение работает как задумано. Утверждение не выполняется (поскольку передаваемые ему значения не равны, assert макрос получает 0), и, следовательно, ваша программа прерывается. Вот как работает заявка:

Если NDEBUG не определен, то Assert проверяет, если его аргумент (который
должен иметь скалярный тип) сравнивается равным нулю. Если это так, утверждаю
выводит специфическую для реализации диагностическую информацию о стандарте
вывод ошибок и вызовы std :: abort
.

Проверьте эта ссылка утверждать для дополнительной информации.

Другие решения

Это должно научить вас использовать функцию assert

Читайте также:  Не отключается электропитание windows 10

Оцените утверждение
Если выражение аргумента этого макроса с функциональной формой сравнивается равным нулю (т. Е. Выражение ложно), сообщение записывается на стандартное устройство ошибки и вызывается метод abort, завершающий выполнение программы.

Специфика показанного сообщения зависит от конкретной реализации в компиляторе, но она должна включать: выражение, утверждение которого не удалось, имя исходного файла и номер строки, в которой оно произошло. Обычный формат выражения:

Ошибка подтверждения: выражение, имя файла, номер строки
Этот макрос отключен, если на момент включения assert.h макрос с именем NDEBUG уже был определен. Это позволяет кодировщику включать много вызовов assert в исходный код при отладке программы, а затем отключить все из них для рабочей версии, просто добавив следующую строку:

Следовательно, этот макрос предназначен для захвата ошибок программирования, а не ошибок пользователя или выполнения, поскольку он обычно отключается после выхода программы из фазы отладки.
от: C ++ Ref

Я только что столкнулся с этой ошибкой при попытке отладки программы на Raspberry Pi. Программа использует GPIO таким способом, который требует запуска программы от имени пользователя root. Например, я запускаю программу, которую я написал так:

Я забыл об этом, однако, при запуске отладчика, и попытался

И я получил ошибку, с которой вы, похоже, столкнулись:

Когда я запускал его с помощью sudo, он работал нормально.

Надеюсь, это поможет кому-то в одной лодке.

Источник

vfork()../nptl/sysdeps/unix/sysv/linux/raise.c: Нет такого файла или каталога

У меня проблема, когда я пытаюсь использовать vfork() . Вот код!

и отладка с информацией об ошибке gdb:

Может ли кто-нибудь помочь?

    ubuntu 13.10 64-разрядная ОС gcc версия 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu8)

Man для vfork(), говорит, что вы никогда не должны возвращаться от функции в дочернем элементе или вызывать exit() — вызывать либо _exit() либо одну из функций exec() .

vfork() отличается от fork (2) тем, что вызывающий поток приостанавливается до тех пор, пока ребенок не завершит (либо нормально, вызывая _exit (2), либо ненормально, после доставки фатального сигнала), либо он вызывает вызов execve ( 2). До этого момента ребенок разделяет всю память со своим родителем, включая стек. Ребенок не должен возвращаться из текущей функции или вызывать exit (3), но может вызывать _exit (2).

Ошибка возникает после возврата с первого вызова printf .

Читайте также:  Windows 10 ест всю память

Сообщение «нет такого файла» связано с тем, что у вас нет источника для библиотеки C. Я бы не стал беспокоиться об этом; вам редко приходится смотреть на это.

Крушение происходит потому, что вы злоупотребляете vfork . Единственными действительными действиями, которые вы можете сделать в дочернем процессе, является вызов execve или аналогичный, для замены процесса другой программой или вызов функции _exit (not exit ) для выхода. Вы получаете неопределенное поведение, если ребенок пытается изменить любые данные, вернуться из функции, называемой vfork , или вызвать другую функцию.

Если вы хотите, чтобы ребенок был клоном родителя и мог продолжить работу с той же программой, используйте fork not vfork .

Источник

vfork () ../ nptl / sysdeps / unix / sysv / linux / raise.c: нет такого файла или каталога

У меня проблема при попытке использовать vfork() . Вот код!

И отладка с информацией об ошибке gdb:

Кто-нибудь может помочь?

  • Ubuntu 13.10 64-битная ОС
  • gcc версии 4.8.1 (Ubuntu / Linaro 4.8.1-10ubuntu8)

2 ответа

На странице руководства для vfork () говорится, что вы никогда не должны возвращаться из функции в дочернем элементе, или вызовите exit() — вызовите либо _exit() , либо одну из функций exec() .

vfork () отличается от fork (2) тем, что вызывающий поток приостанавливается до завершения дочернего процесса (либо обычно, вызывая _exit (2), либо ненормально, после доставки фатального сигнала), либо он выполняет вызов execve ( 2). До этого момента дочерний элемент разделяет всю память со своим родителем, включая стек. Потомок не должен возвращаться из текущей функции или вызывать exit (3), но может вызывать _exit (2).

Ошибка возникает после возврата из первого вызова printf .

Сообщение «нет такого файла» возникает из-за того, что у вас нет доступного источника для библиотеки C. Я бы не стал беспокоиться об этом; на это редко нужно смотреть.

Причина сбоя в том, что вы неправильно используете vfork . Единственное допустимое действие, которое вы можете сделать в дочернем процессе, — это вызвать execve или аналогичный, заменить процесс другой программой или вызвать _exit ( не exit ) выходить. Вы получаете неопределенное поведение, если ребенок пытается изменить какие-либо данные, вернуться из функции, которая вызвала vfork , или вызвать другую функцию.

Если вы хотите, чтобы дочерний элемент был клоном родителя и мог продолжать выполнять ту же программу, используйте fork , а не vfork .

Источник

Оцените статью