Меню

Код ошибки sigsegv slimjet

30.12.2019C

Ошибка сегментации (SIGSEGV) и Ошибка шины (SIGBUS) — это сигналы, генерируемые операционной системой, когда обнаружена серьезная программная ошибка, и программа не может продолжить выполнение из-за этих ошибок.

1) Ошибка сегментации (также известная как SIGSEGV и обычно являющаяся сигналом 11) возникает, когда программа пытается записать / прочитать вне памяти, выделенной для нее, или при записи памяти, которая может быть прочитана. Другими словами, когда программа пытается получить доступ к память, к которой у него нет доступа. SIGSEGV — это сокращение от «Нарушение сегментации».

Несколько случаев, когда сигнал SIGSEGV генерируется следующим образом:
-> Использование неинициализированного указателя
-> Разыменование нулевого указателя
-> Попытка доступа к памяти, которой не владеет программа (например, попытка доступа к элементу массива
вне границ массива).
-> Попытка получить доступ к памяти, которая уже выделена (попытка использовать висячие указатели).
Пожалуйста, обратитесь к этой статье за примерами.

2) Ошибка шины (также известная как SIGBUS и обычно являющаяся сигналом 10) возникает, когда процесс пытается получить доступ к памяти, которую ЦП не может физически адресовать. Другими словами, память, к которой программа пыталась получить доступ, не является действительным адресом памяти. вызвано из-за проблем с выравниванием с процессором (например, попытка прочитать длинный из адреса, который не кратен 4). SIGBUS — сокращение от «Ошибка шины».

Сигнал SIGBUS возникает в следующих случаях,
-> Программа дает указание процессору прочитать или записать конкретный адрес физической памяти, который является недопустимым / Запрашиваемый физический адрес не распознается всей компьютерной системой.
-> Нераспределенный доступ к памяти (например, если многобайтовый доступ должен быть выровнен по 16 битам, адреса (заданные в байтах) в 0, 2, 4, 6 и т. Д. Будут считаться выровненными и, следовательно, доступными, в то время как адреса 1, 3, 5 и т. Д. Будет считаться не выровненным.)

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

Ниже приведен пример ошибки шины, взятой из википедии .

#include <stdlib.h>

int main(int argc, char **argv) 

{

     
#if defined(__GNUC__)
# if defined(__i386__)

    __asm__("pushfnorl $0x40000,(%esp)npopf");

# elif defined(__x86_64__) 

    __asm__("pushfnorl $0x40000,(%rsp)npopf");

# endif
#endif

    char *cptr = malloc(sizeof(int) + 1);

    int *iptr = (int *) ++cptr;

    *iptr = 42;

    return 0;

}

Выход :

Bad memory access (SIGBUS) 

Эта статья предоставлена Прашант Пангера . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

  • Базовый дамп (ошибка сегментации) в C / C ++
  • Как найти ошибку сегментации в C & C ++? (С использованием GDB)
  • Сегментация памяти в микропроцессоре 8086
  • Иначе без IF и L-Value Обязательная ошибка в C
  • Обработка ошибок в программах на Си
  • Программные сигналы об ошибках
  • Предопределенные макросы в C с примерами
  • Как создать графический интерфейс в программировании на C, используя GTK Toolkit
  • Библиотека ctype.h (<cctype>) в C / C ++ с примерами
  • Слабые байты в структурах: объяснение на примере
  • Разница между итераторами и указателями в C / C ++ с примерами
  • C программа для подсчета количества гласных и согласных в строке
  • Вложенные циклы в C с примерами
  • Программа Hello World: первая программа во время обучения программированию

Ошибка сегментации (SIGSEGV) и ошибка шины (SIGBUS)

0.00 (0%) 0 votes

What is the root cause of the segmentation fault (SIGSEGV), and how to handle it?

Rohan Bari's user avatar

Rohan Bari

7,3743 gold badges13 silver badges34 bronze badges

asked Oct 14, 2009 at 5:20

Vaibhav's user avatar

0

Wikipedia has the answer, along with a number of other sources.

A segfault basically means you did something bad with pointers. This is probably a segfault:

char *c = NULL;
...
*c; // dereferencing a NULL pointer

Or this:

char *c = "Hello";
...
c[10] = 'z'; // out of bounds, or in this case, writing into read-only memory

Or maybe this:

char *c = new char[10];
...
delete [] c;
...
c[2] = 'z'; // accessing freed memory

Same basic principle in each case — you’re doing something with memory that isn’t yours.

answered Oct 14, 2009 at 5:25

Chris Lutz's user avatar

Chris LutzChris Lutz

72.1k16 gold badges127 silver badges182 bronze badges

There are various causes of segmentation faults, but fundamentally, you are accessing memory incorrectly. This could be caused by dereferencing a null pointer, or by trying to modify readonly memory, or by using a pointer to somewhere that is not mapped into the memory space of your process (that probably means you are trying to use a number as a pointer, or you incremented a pointer too far). On some machines, it is possible for a misaligned access via a pointer to cause the problem too — if you have an odd address and try to read an even number of bytes from it, for example (that can generate SIGBUS, instead).

answered Oct 14, 2009 at 5:25

Jonathan Leffler's user avatar

Jonathan LefflerJonathan Leffler

717k138 gold badges891 silver badges1259 bronze badges

2

using an invalid/null pointer? Overrunning the bounds of an array? Kindof hard to be specific without any sample code.

Essentially, you are attempting to access memory that doesn’t belong to your program, so the OS kills it.

answered Oct 14, 2009 at 5:22

MichaelM's user avatar

MichaelMMichaelM

5,2582 gold badges29 silver badges23 bronze badges

Here is an example of SIGSEGV.

root@pierr-desktop:/opt/playGround# cat test.c
int main()
{
     int * p ;
     * p = 0x1234;
     return 0 ;
}
root@pierr-desktop:/opt/playGround# g++ -o test test.c  
root@pierr-desktop:/opt/playGround# ./test 
Segmentation fault

And here is the detail.

How to handle it?

  1. Avoid it as much as possible in the
    first place.

    Program defensively: use assert(), check for NULL pointer , check for buffer overflow.

    Use static analysis tools to examine your code.

    compile your code with -Werror -Wall.

    Has somebody review your code.

  2. When that actually happened.

    Examine you code carefully.

    Check what you have changed since the last time you code run successfully without crash.

    Hopefully, gdb will give you a call stack so that you know where the crash happened.


EDIT : sorry for a rush. It should be *p = 0x1234; instead of p = 0x1234;

answered Oct 14, 2009 at 5:23

pierrotlefou's user avatar

pierrotlefoupierrotlefou

39.1k35 gold badges134 silver badges174 bronze badges

4

SigSegV means a signal for memory access violation, trying to read or write from/to a memory area that your process does not have access to. These are not C or C++ exceptions and you can’t catch signals. It’s possible indeed to write a signal handler that ignores the problem and allows continued execution of your unstable program in undefined state, but it should be obvious that this is a very bad idea.

Most of the time this is because of a bug in the program. The memory address given can help debug what’s the problem (if it’s close to zero then it’s likely a null pointer dereference, if the address is something like 0xadcedfe then it’s intentional safeguard or a debug check, etc.)

One way of “catching” the signal is to run your stuff in a separate child process that can then abruptly terminate without taking your main process down with it. Finding the root cause and fixing it is obviously preferred over workarounds like this.

answered May 23, 2019 at 15:05

Ashish Khandelwal's user avatar

The initial source cause can also be an out of memory.

answered Nov 13, 2020 at 16:07

Makusensu's user avatar

MakusensuMakusensu

2793 silver badges10 bronze badges

2

Segmentation fault arrives when you access memory which is not declared by the program. You can do this through pointers i.e through memory addresses. Or this may also be due to stackoverflow for example:

void rec_func() {int q = 5; rec_func();}

int main() {rec_func();}

This call will keep on consuming stack memory until it’s completely filled and thus finally stackoverflow happens.
Note: it might not be visible in some competitive questions as it leads to timeouterror first but for those in which timeout doesn’t happens its a hard time figuring out SIGSEGV.

Sapphire_Brick's user avatar

answered Oct 14, 2018 at 7:03

NIKESH SINGH's user avatar

What is the root cause of the segmentation fault (SIGSEGV), and how to handle it?

Rohan Bari's user avatar

Rohan Bari

7,3743 gold badges13 silver badges34 bronze badges

asked Oct 14, 2009 at 5:20

Vaibhav's user avatar

0

Wikipedia has the answer, along with a number of other sources.

A segfault basically means you did something bad with pointers. This is probably a segfault:

char *c = NULL;
...
*c; // dereferencing a NULL pointer

Or this:

char *c = "Hello";
...
c[10] = 'z'; // out of bounds, or in this case, writing into read-only memory

Or maybe this:

char *c = new char[10];
...
delete [] c;
...
c[2] = 'z'; // accessing freed memory

Same basic principle in each case — you’re doing something with memory that isn’t yours.

answered Oct 14, 2009 at 5:25

Chris Lutz's user avatar

Chris LutzChris Lutz

72.1k16 gold badges127 silver badges182 bronze badges

There are various causes of segmentation faults, but fundamentally, you are accessing memory incorrectly. This could be caused by dereferencing a null pointer, or by trying to modify readonly memory, or by using a pointer to somewhere that is not mapped into the memory space of your process (that probably means you are trying to use a number as a pointer, or you incremented a pointer too far). On some machines, it is possible for a misaligned access via a pointer to cause the problem too — if you have an odd address and try to read an even number of bytes from it, for example (that can generate SIGBUS, instead).

answered Oct 14, 2009 at 5:25

Jonathan Leffler's user avatar

Jonathan LefflerJonathan Leffler

717k138 gold badges891 silver badges1259 bronze badges

2

using an invalid/null pointer? Overrunning the bounds of an array? Kindof hard to be specific without any sample code.

Essentially, you are attempting to access memory that doesn’t belong to your program, so the OS kills it.

answered Oct 14, 2009 at 5:22

MichaelM's user avatar

MichaelMMichaelM

5,2582 gold badges29 silver badges23 bronze badges

Here is an example of SIGSEGV.

root@pierr-desktop:/opt/playGround# cat test.c
int main()
{
     int * p ;
     * p = 0x1234;
     return 0 ;
}
root@pierr-desktop:/opt/playGround# g++ -o test test.c  
root@pierr-desktop:/opt/playGround# ./test 
Segmentation fault

And here is the detail.

How to handle it?

  1. Avoid it as much as possible in the
    first place.

    Program defensively: use assert(), check for NULL pointer , check for buffer overflow.

    Use static analysis tools to examine your code.

    compile your code with -Werror -Wall.

    Has somebody review your code.

  2. When that actually happened.

    Examine you code carefully.

    Check what you have changed since the last time you code run successfully without crash.

    Hopefully, gdb will give you a call stack so that you know where the crash happened.


EDIT : sorry for a rush. It should be *p = 0x1234; instead of p = 0x1234;

answered Oct 14, 2009 at 5:23

pierrotlefou's user avatar

pierrotlefoupierrotlefou

39.1k35 gold badges134 silver badges174 bronze badges

4

SigSegV means a signal for memory access violation, trying to read or write from/to a memory area that your process does not have access to. These are not C or C++ exceptions and you can’t catch signals. It’s possible indeed to write a signal handler that ignores the problem and allows continued execution of your unstable program in undefined state, but it should be obvious that this is a very bad idea.

Most of the time this is because of a bug in the program. The memory address given can help debug what’s the problem (if it’s close to zero then it’s likely a null pointer dereference, if the address is something like 0xadcedfe then it’s intentional safeguard or a debug check, etc.)

One way of “catching” the signal is to run your stuff in a separate child process that can then abruptly terminate without taking your main process down with it. Finding the root cause and fixing it is obviously preferred over workarounds like this.

answered May 23, 2019 at 15:05

Ashish Khandelwal's user avatar

The initial source cause can also be an out of memory.

answered Nov 13, 2020 at 16:07

Makusensu's user avatar

MakusensuMakusensu

2793 silver badges10 bronze badges

2

Segmentation fault arrives when you access memory which is not declared by the program. You can do this through pointers i.e through memory addresses. Or this may also be due to stackoverflow for example:

void rec_func() {int q = 5; rec_func();}

int main() {rec_func();}

This call will keep on consuming stack memory until it’s completely filled and thus finally stackoverflow happens.
Note: it might not be visible in some competitive questions as it leads to timeouterror first but for those in which timeout doesn’t happens its a hard time figuring out SIGSEGV.

Sapphire_Brick's user avatar

answered Oct 14, 2018 at 7:03

NIKESH SINGH's user avatar

Icon Ex Номер ошибки: Ошибка Sigsegv (0xb)
Название ошибки: Java Error Sigsegv (0Xb)
Описание ошибки: Ошибка Sigsegv (0xb): Возникла ошибка в приложении Java. Приложение будет закрыто. Приносим извинения за неудобства.
Разработчик: Oracle Corporation
Программное обеспечение: Java
Относится к: Windows XP, Vista, 7, 8, 10, 11

Проверка «Java Error Sigsegv (0Xb)»

Как правило, практикующие ПК и сотрудники службы поддержки знают «Java Error Sigsegv (0Xb)» как форму «ошибки во время выполнения». Чтобы убедиться, что функциональность и операции работают в пригодном для использования состоянии, разработчики программного обеспечения, такие как Oracle Corporation, выполняют отладку перед выпусками программного обеспечения. Ошибки, такие как ошибка Sigsegv (0xb), иногда удаляются из отчетов, оставляя проблему остается нерешенной в программном обеспечении.

Пользователи Java могут столкнуться с ошибкой Sigsegv (0xb), вызванной нормальным использованием приложения, которое также может читать как «Java Error Sigsegv (0Xb)». Сообщение об этой ошибке Sigsegv (0xb) позволит разработчикам обновить свое приложение и исправить любые ошибки, которые могут вызвать его. Затем Oracle Corporation исправит ошибки и подготовит файл обновления для загрузки. Если есть запрос на обновление Java, это обычно обходной путь для устранения проблем, таких как ошибка Sigsegv (0xb) и другие ошибки.

Что запускает ошибку времени выполнения Sigsegv (0xb)?

Ошибки выполнения при запуске Java — это когда вы, скорее всего, столкнетесь с «Java Error Sigsegv (0Xb)». Вот три наиболее распространенные причины, по которым происходят ошибки во время выполнения ошибки Sigsegv (0xb):

Ошибка Sigsegv (0xb) Crash — Ошибка Sigsegv (0xb) остановит компьютер от выполнения обычной программной операции. Если данный ввод недействителен или не соответствует ожидаемому формату, Java (или OS) завершается неудачей.

Утечка памяти «Java Error Sigsegv (0Xb)» — ошибка Sigsegv (0xb) утечка памяти приводит к увеличению размера Java и используемой мощности, что приводит к низкой эффективности систем. Потенциальным фактором ошибки является код Oracle Corporation, так как ошибка предотвращает завершение программы.

Ошибка Sigsegv (0xb) Logic Error — логическая ошибка возникает, когда Java производит неправильный вывод из правильного ввода. Это происходит, когда исходный код Oracle Corporation вызывает уязвимость при обработке информации.

Oracle Corporation проблемы с Java Error Sigsegv (0Xb) чаще всего связаны с повреждением или отсутствием файла Java. Обычно, установка новой версии файла Oracle Corporation позволяет устранить проблему, из-за которой возникает ошибка. В некоторых случаях реестр Windows пытается загрузить файл Java Error Sigsegv (0Xb), который больше не существует; в таких ситуациях рекомендуется запустить сканирование реестра, чтобы исправить любые недопустимые ссылки на пути к файлам.

Классические проблемы Java Error Sigsegv (0Xb)

Усложнения Java с Java Error Sigsegv (0Xb) состоят из:

  • «Ошибка Java Error Sigsegv (0Xb). «
  • «Недопустимая программа Win32: Java Error Sigsegv (0Xb)»
  • «Извините, Java Error Sigsegv (0Xb) столкнулся с проблемой. «
  • «Файл Java Error Sigsegv (0Xb) не найден.»
  • «Java Error Sigsegv (0Xb) не может быть найден. «
  • «Ошибка запуска программы: Java Error Sigsegv (0Xb).»
  • «Java Error Sigsegv (0Xb) не работает. «
  • «Java Error Sigsegv (0Xb) выйти. «
  • «Неверный путь к приложению: Java Error Sigsegv (0Xb).»

Проблемы Java Error Sigsegv (0Xb) с участием Javas возникают во время установки, при запуске или завершении работы программного обеспечения, связанного с Java Error Sigsegv (0Xb), или во время процесса установки Windows. Важно отметить, когда возникают проблемы Java Error Sigsegv (0Xb), так как это помогает устранять проблемы Java (и сообщать в Oracle Corporation).

Эпицентры Java Error Sigsegv (0Xb) Головные боли

Большинство проблем Java Error Sigsegv (0Xb) связаны с отсутствующим или поврежденным Java Error Sigsegv (0Xb), вирусной инфекцией или недействительными записями реестра Windows, связанными с Java.

В частности, проблемы с Java Error Sigsegv (0Xb), вызванные:

  • Недопустимая (поврежденная) запись реестра Java Error Sigsegv (0Xb).
  • Файл Java Error Sigsegv (0Xb) поврежден от вирусной инфекции.
  • Вредоносное удаление (или ошибка) Java Error Sigsegv (0Xb) другим приложением (не Java).
  • Другое программное обеспечение, конфликтующее с Java, Java Error Sigsegv (0Xb) или общими ссылками.
  • Поврежденная загрузка или неполная установка программного обеспечения Java.

Продукт Solvusoft

Загрузка
WinThruster 2022 — Проверьте свой компьютер на наличие ошибок.

Совместима с Windows 2000, XP, Vista, 7, 8, 10 и 11

Установить необязательные продукты — WinThruster (Solvusoft) | Лицензия | Политика защиты личных сведений | Условия | Удаление

Модератор: Модераторы

Как локализовать ошибку SIGSEGV?

Здравствуйте. Время от времени получаю такую коварную ситуацию. При работе через отладчик, конфликт доступа к памяти возникает практически в каких угодно местах. Если в логике программы содержится ошибка, отладчик ее не покажет, а покажет дизасемблированый код того места, где возникло последствие, а не причина. Есть ли какие то медоты/приемы как диагностировать такие ошибки? Кроме общей грамотности и хорошего знания языка, коим не обладаю.

CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение Лекс Айрин » 02.09.2016 20:13:33

Карандаш и пошаговое выполнение в «ручном» режиме.
Как правило, это ошибка неправильной работы с объектами/указателями.

Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
  • Профиль
  • Сайт

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 02.09.2016 20:42:09

Лекс Айрин именно так. В ручном режиме не всегда есть возможность выполнить алгоритм, например, если имеет место обмен данными с другим приложением. Из-за такой опасности пропадает желание развивать приложение и реализовывать сложные схемы. Возможно всеже есть какой то выход?

CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение azsx » 02.09.2016 20:52:09

не знаю верный ли мой способ, но я стал писать логи. То есть во всех проблемных местах условие, если лог = труе то писать «этап в программе». Тогда при ошибке по логам можно весьма точно понять где ошибка.
Ошибка всего один раз была не на моей стороне, а на стороне модуля постгрес в лазарус.

azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Как локализовать ошибку SIGSEGV?

Сообщение Лекс Айрин » 02.09.2016 21:12:14

CRobin, понятное дело, что тяжело. Но, кстати, сомневаюсь, что обмен данными может привести к подобной ошибке. Для этого надо очень плохо писать код — наплевав, как минимум, на проверки диапазонов (массивов, ссылок).

Можно писать код маленькими порциями. Написал, проверил, отладил и забыл. Можно отключать проблемный (или кажущийся проблемным) код. Логи, кстати, в таких случаях очень желательны — особенно если используется специальные проверочные данные.
Иногда поведение программы очень сильно отличается от ожидаемого.

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

Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
  • Профиль
  • Сайт

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 02.09.2016 23:15:47

Лекс Айрин я имел в виду, что наличие клиента или сервера (по сути второй стороны) может создавать логические ситуации, которые невозможно воспроизвести.

Добавлено спустя 4 минуты 48 секунд:
azsx логи как правило показывают ошибки, которые являются следствием искомой ошибки. Например, обращение к несуществующему элементу в модуле А, может спокойно вызвать сбой в модуле Б и модуле С. При этом большая опасность, если вы начнете исследовать модули Б и С, сломать то, что работает.

CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение azsx » 03.09.2016 03:20:56

обращение к несуществующему элементу в модуле А, может спокойно вызвать сбой в модуле Б и модуле С. При этом большая опасность, если вы начнете исследовать модули Б и С, сломать то, что работает.

Не поверите и такие ситуации у меня бывали. Типа вот конкретная строка кода, до неё лог срабатывает, после неё лог уже не пишется. А строка как строка и ошибка ваще ниже по коду была. Вот в таких случаях сижу, разбираюсь в коде, который сам написал, ищу ошибку в этой строке или в коде который до этой строки следует и т.п. Конечно, если бы я на ассемблерный код глянул и сразу чувствовал бы где я сделал в паскалевском коде ошибку — было бы значительно проще.
Бывает и иначе. Написал алгоритм, программа каждые пару суток вылетает как часы. Я программу запускаю с bat файла, в нем цикл — вылетела, снова запускается. Да и нафиг надо искать проблему, прямо других занятий нет, кроме как доводить свой софт до совершенства.

azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Как локализовать ошибку SIGSEGV?

Сообщение Лекс Айрин » 03.09.2016 09:42:40

CRobin писал(а):я имел в виду, что наличие клиента или сервера (по сути второй стороны) может создавать логические ситуации, которые невозможно воспроизвести.

да ладно… можно написать эмулятор. А зная формат данных можно будет прогнать спорный момент через все или все типичные ошибки.

Можно запустить копию клиента/сервера у себя. И не говори, что поднять сервак это суперсложная проблема. Под виндой это, допустим, Денвер. Под линухой он идет в репах и его настройка, в принципе, не настолько сложна как представляется.

Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
  • Профиль
  • Сайт

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 03.09.2016 10:58:05

Лекс Айрин писал(а):да ладно… можно написать эмулятор

Конечно же можно, и даже нужно)) Но если процесс взаимодействия не линейный, то не возможно в принципе воспроизвести все игровые ситуации.

CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение Лекс Айрин » 03.09.2016 11:39:05

CRobin, не, конечно, если ошибка возникает, когда возьмешь правое ухо левой ногой, а левое правой, а потом нажмешь эксейп носом, ее воспроизвести сложновато…

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

Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
  • Профиль
  • Сайт

Re: Как локализовать ошибку SIGSEGV?

Сообщение zub » 03.09.2016 11:43:05

CRobin
>>Здравствуйте. Время от времени получаю такую коварную ситуацию.
Ситуация вполне обычная)) Баги всегда кажутся какимито «сказочными», а когда их найдешь оказываются глупыми
>>Если в логике программы содержится ошибка, отладчик ее не покажет
а посмотреть стек вызовов?
>>Кроме общей грамотности и хорошего знания языка, коим не обладаю.
Собрать программу с heaptrc — устранить ругань (при этом нужно чтобы программа штатно завершалась, а не падала, при падении будет куча лишней ругани на всю не освобожденную память)
Прогнать прогрпамму в valgrind — устранить ругань

azsx
>>Типа вот конкретная строка кода, до неё лог срабатывает, после неё лог уже не пишется. А строка как строка и ошибка ваще ниже по коду была.
Мистики тут быть неможет. После нахождения ошибки такое «невообразимое» поведение становится объяснимым и понятным
>>Да и нафиг надо искать проблему
Если даже программа одноразовая-ненужная, ошибку надо найти и устранить для приобретения соответствующего опыта
>>Конечно, если бы я на ассемблерный код глянул и сразу чувствовал бы где я сделал в паскалевском коде ошибку — было бы значительно проще.
Если ошибку не видно глядя на паскаль, то глядеть на асемблер вообще смысла нет.

zub
долгожитель
 
Сообщения: 2858
Зарегистрирован: 14.11.2005 23:51:26
  • Профиль
  • Сайт

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 03.09.2016 11:57:48

zub писал(а):а когда их найдешь оказываются глупыми

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

CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение zub » 03.09.2016 12:00:10

Везенью тут не место.

zub
долгожитель
 
Сообщения: 2858
Зарегистрирован: 14.11.2005 23:51:26
  • Профиль
  • Сайт

Re: Как локализовать ошибку SIGSEGV?

Сообщение CRobin » 03.09.2016 12:10:01

zub спасибо за упоминания инструментов, буду гуглить

CRobin
постоялец
 
Сообщения: 145
Зарегистрирован: 26.01.2016 12:15:39

Re: Как локализовать ошибку SIGSEGV?

Сообщение azsx » 03.09.2016 12:15:45

zub почему то подумалось, когда читал Ваш пост. Есть такие бравые программисты, они умны, бородаты в очках. У них компьютер всегда выполняет записанные ими инструкции, опечатки бывают, но они их исправляют. Побольше бы их таких.
зы
я не такой, я вежливо говоря разгильдяй и книжку «херак, херак и в продакшен» я бы почитал с удовольствием.
Но мысли у вас верные, я буду стараться.

azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

0 / 0 / 0

Регистрация: 20.03.2017

Сообщений: 3

1

20.03.2017, 03:21. Показов 7475. Ответов 2


Программа банальна. Два элемента Memo, создается матрица, выводится в Memo1, потом идет обработка матрицы(добавляется столбец в Memo1, где котором записаны суммы всех строк, с помощью Inputbox вводят число, строки, чья сумма больше заданного условия — выводятся в Memo2.) Программа компилится, все кнопки работают, при нажатии на кнопку обработки — ругается. Выдает:»External:SIGSEGV по адресу 10000931A» С таким видом этой ошибки не встречался. Раньше помогало обнулить все переменные перед процедурой, проверить unit1, чтобы процедуры вызывались нормально и использовали глобальные переменные. Но тут что-то новенькое. В упор не вижу проблемы. Помогите пожалуйста! В интернете не нашел никакой помощи.
Сам код из Unit1

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Unit2;
 
type
 
  { TForm1 }
  arr = array of array of integer;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  ar: arr;
  n,k:integer;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Matrix;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Summa;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  memo1.lines.clear;
  memo2.Lines.Clear;
  ar:=NIL;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  Application.Terminate;
end;
 
end.

Unit2

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
unit Unit2;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
 
procedure Matrix();
procedure Summa();
 
implementation
uses FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, unit1;
 
procedure Matrix();
var userstring1, userstring2, string1:string; i,j:integer;
begin
  string1:='';
  userstring1:=Inputbox('Ввод строк.',
                        'Введите кол-во строк в вашей матрице.',
                        '2');
  userstring2:=Inputbox('Ввод столбцов.',
                        'Введите кол-во столбцов в вашей матрице.',
                        '2');
  n:=strtoint(userstring1);
  k:=strtoint(userstring2);
  SetLength(ar,n,k);
  Randomize;
  for i:=0 to n-1 do
  begin
    for j:=0 to k-1 do
    begin
      ar[i,j]:=Random(100);
    end;
  end;
  for i:=0 to n-1 do
  begin
    for j:=0 to k-1 do
    begin
      string1:=string1+inttostr(ar[i,j])+' ';
    end;
    with form1 do Memo1.Lines.Add(string1);
    String1:='';
  end;
end;
 
procedure Summa();
var i,j,sum,objective:integer; userstring1, string1:string; summs:array [1..100] of integer;
begin
  string1:='';
  objective:=0;
  sum:=0;
  for i:=0 to n-1 do
  begin
    for j:=0 to k-1 do
    begin
      sum:=sum+ar[i,j];
    end;
    summs[i]:=sum;
    with form1 do Memo1.lines.strings[i]:=Memo1.Lines.Strings[i]+' '+inttostr(sum);
    sum:=0;
  end;
    userstring1:=InputBox('Ввод условия',
                          'Введите число, больше которого должны быть суммы строк.',
                          '0');
    objective:=strtoint(userstring1);
    for i:=0 to n-1 do
    begin
      if summs[i]>objective then
      begin
        for j:=0 to k-1 do
        begin
          string1:=string1+inttostr(ar[i,j])+' ';
        end;
      with form1 do memo2.lines.Add(string1);
      string1:='';
      end;
    end;
end;
 
end.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Почему этот код выдает ОШИБКУ RUNTIME SIGSEGV. Я пробовал запустить код и отлично работает с кодовыми блоками, но некоторая IDE выдает мне эту ошибку.

Требуется ряд Фибоначчи, затем модуль каждого числа в ряду и занимает только числа в канадских разрядах, пока не будет получено одно число.

Например: введите 1 9 {0 1 1 2 3 5 8 13 21} -> {0 1 1 2 3 5 8 3 1} -> {1 2 5 3} -> {2 3} -> 3

#include <stdio.h>

int main(void) {
    // your code goes here
    int n,j,k,r,o;
    o=0;


//  printf("enter the number of test cases: ");
    scanf("%d",&n);
    int s[n];
    int a;
    a=n;

    while(n!=0)
    {


         r=k;
         int e[k/2];
         int m;
         scanf("%d",&k);//enter say 9
      if(k!=1)
            {
              int i[k];
              i[0]=0;
              i[1]=1;

              for(j=0;j<k;j++)
                  {
                     if(j>1)
                       {
                         i[j]=(i[j-2]+i[j-1])%10;
                       }


                  }


              while(r!=1)
                {
                 m=0;

                 for(j=0;j<r;j++)
                    {

                      if(j!=0)
                       {

                        if(j%2!=0)
                         {
                           e[m]=i[j];
                           m++;
                         }
                       }
                    }

                 for(j=0;j<k/2;j++)
                    {
                      i[j]=e[j];
                    }
                 r=r/2;
                }
             s[o]=e[0];
             o++;
             n--;
           }
        else
           {
             return 0;
           }


    }
    if(k!=1)
      {
        for(j=0;j<a;j++)
         {
             printf("%dn",s[j]);
         }
      }


    return 0;
}

Я хочу знать, какая точка кода вызывает ошибку, я мало знаю об этой ошибке (например, доступ к массиву за пределами связей), вы можете мне это объяснить?

3 ответа

Ваша переменная k не инициализирована, когда вы впервые обращаетесь к ней на

r=k;
int e[k/2];

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

В следующей строке вы объявляете массив e[k/2] с размером k/2, но поскольку k никогда не инициализировался, он может быть любого размера. Если k оказывается отрицательным, я получаю ошибку сегментации в этой строке.

Чтобы решить эту проблему, вам необходимо инициализировать все ваши переменные перед их использованием.

Ошибка сегментации (SIGSEGV) — это то, что происходит, если вы пытаетесь получить доступ к памяти, которая не выделена вашей программе операционной системой.

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


0

Alex B
7 Сен 2019 в 08:43

Просто поместите scanf("%d",&k); выше r=k;

SIGSEGV — это ошибка (сигнал), вызванная недопустимой ссылкой на память или ошибкой сегментации. Вероятно, вы пытаетесь получить доступ к элементу массива вне пределов или пытаетесь использовать слишком много памяти.

Также. я не уверен насчет return 0; в инструкции else. я не запускал код, поэтому могу ошибиться, но он должен быть return 1; вместо return 0;

if(j!=0)
{
      if(j%2!=0)
      {
            e[m]=i[j];
            m++;
      }
}

Вы можете заменить его на if(j != 0 && j%2 != 0)


0

Aru Viser
7 Сен 2019 в 09:10

Я знаю, что этот вопрос, о котором вы говорите … Это не то, как вы должны его решать … Вы должны найти число, которое останется за время O (1) … Поскольку нечетные места удаляются, мы нужно беспокоиться только о четных местах … Теперь эти четные места могут стать нечетными при многократном делении на два … Следовательно, существует фиксированное количество шагов, которые преобразуют весь массив в один элемент … В каждой точке этого Шаг четное число делится на 2, следовательно, будет только одно четное число, которое не станет нечетным, помещенное между этими шагами или после них … Вы должны найти это число, просто посмотрев N, по крайней мере, я сделал то же самое … Это всего лишь намек, если непонятно, могу пояснить логику в комментариях … Голосовать за


0

RAHUL
8 Сен 2019 в 06:12

Не всегда программы в Linux запускаются как положено. Иногда, в силу разных причин программа вместо нормальной работы выдает ошибку. Но нам не нужна ошибка, нам нужна программа, вернее, та функция, которую она должна выполнять. Сегодня мы поговорим об одной из самых серьезных и непонятных ошибок. Это ошибка сегментации Ubuntu. Если такая ошибка происходит только один раз, то на нее можно не обращать внимания, но если это регулярное явление нужно что-то делать.

Конечно, случается эта проблема не только в Ubuntu, а во всех Linux дистрибутивах, поэтому наша инструкция будет актуальна для них тоже. Но сосредоточимся мы в основном на Ubuntu. Рассмотрим что такое ошибка сегментирования linux, почему она возникает, а также как с этим бороться и что делать.

Что такое ошибка сегментации?

Ошибка сегментации, Segmentation fault, или Segfault, или SIGSEGV в Ubuntu и других Unix подобных дистрибутивах, означает ошибку работы с памятью. Когда вы получаете эту ошибку, это значит, что срабатывает системный механизм защиты памяти, потому что программа попыталась получить доступ или записать данные в ту часть памяти, к которой у нее нет прав обращаться.

Чтобы понять почему так происходит, давайте рассмотрим как устроена работа с памятью в Linux, я попытаюсь все упростить, но приблизительно так оно и работает.

Допустим, в вашей системе есть 6 Гигабайт оперативной памяти, каждой программе нужно выделить определенную область, куда будет записана она сама, ее данные и новые данные, которые она будет создавать. Чтобы дать возможность каждой из запущенных программ использовать все шесть гигабайт памяти был придуман механизм виртуального адресного пространства. Создается виртуальное пространство очень большого размера, а из него уже выделяется по 6 Гб для каждой программы. Если интересно, это адресное пространство можно найти в файле /proc/kcore, только не вздумайте никуда его копировать.

Выделенное адресное пространство для программы называется сегментом. Как только программа попытается записать или прочитать данные не из своего сегмента, ядро отправит ей сигнал SIGSEGV и программа завершится с нашей ошибкой. Более того, каждый сегмент поделен на секции, в некоторые из них запись невозможна, другие нельзя выполнять, если программа и тут попытается сделать что-то запрещенное, мы опять получим ошибку сегментации Ubuntu.

Почему возникает ошибка сегментации?

И зачем бы это порядочной программе лезть, куда ей не положено? Да в принципе, незачем. Это происходит из-за ошибки при написании программ или несовместимых версиях библиотек и ПО. Часто эта ошибка встречается в программах на Си или C++. В этом языке программисты могут вручную работать с памятью, а язык со своей стороны не контролирует, чтобы они это делали правильно, поэтому одно неверное обращение к памяти может обрушить программу.

Почему может возникать эта ошибка при несовместимости библиотек? По той же причине — неверному обращению к памяти. Представим, что у нас есть библиотека linux (набор функций), в которой есть функция, которая выполняет определенную задачу. Для работы нашей функции нужны данные, поэтому при вызове ей нужно передать строку. Наша старая версия библиотеки ожидает, что длина строки будет до 256 символов. Но программа была обновлена формат записи поменялся, и теперь она передает библиотеке строку размером 512 символов. Если обновить программу, но оставить старую версию библиотеки, то при передаче такой строки 256 символов запишутся нормально в подготовленное место, а вот вторые 256 перезапишут данные программы, и возможно, попытаются выйти за пределы сегмента, тогда и будет ошибка сегментирования linux.

Что делать если возникла ошибка сегментирования?

Если вы думаете, что это ошибка в программе, то вам остается только отправить отчет об ошибке разработчикам. Но вы все-таки еще можете попытаться что-то сделать.

Например, если падает с ошибкой сегментации неизвестная программа, то мы можем решить что это вина разработчиков, но если с такой ошибкой падает chrome или firefox при запуске возникает вопрос, может мы делаем что-то не так? Ведь это уже хорошо протестированные программы.

Первое, что нужно сделать — это обновить систему до самой последней версии, возможно, был баг и его уже исправили, а может у вас установлены старые версии библиотек и обновление решит проблему. В Ubuntu это делается так:

sudo apt update
sudo apt full-upgrade

Если это не помогло, нужно обнулить настройки программы до значений по умолчанию, возможно, удалить кэш. Настройки программ в Linux обычно содержатся в домашней папке, скрытых подкаталогах с именем программы. Также, настройки и кэш могут содержаться в каталогах ~/.config и ~/.cache. Просто удалите папки программы и попробуйте снова ее запустить. Если и это не помогло, вы можете попробовать полностью удалить программу, а потом снова ее установить, возможно, какие-нибудь зависимости были повреждены:

sudo apt remove пакет_программы
sudo apt autoremove
sudo apt install пакет_программы

Если есть возможность, попробуйте установить программу из другого источника, например, не из PPA, а более старую версию, из официальных репозиториев.

Когда вы все это выполнили, скорее всего, проблема не в вашем дистрибутиве, а в самой программе. Нужно отправлять отчет разработчикам. В Ubuntu это можно сделать с помощью программы apport-bug. Обычно Ubuntu предлагает это сделать сразу, после того как программа завершилась с ошибкой сегментирования. Если же ошибка сегментирования Ubuntu встречается не в системной программе, то вам придется самим искать разработчиков и вручную описывать что произошло.

Чтобы помочь разработчикам решить проблему, недостаточно отправить им только сообщение что вы поймали Segmentation Fault, нужно подробно описать проблему, действия, которые вы выполняли перед этим, так чтобы разработчик мог их воспроизвести. Также, желательно прикрепить к отчету последние функции, которые вызывала программа (стек вызовов функций), это может очень сильно помочь разработчикам.

Рассмотрим, как его получить. Это не так уж сложно. Сначала запустите вашу программу, затем узнайте ее PID с помощью команды:

pgrep программа

Дальше запускаем отладчик gdb:

sudo gdb -q

Подключаемся к программе:

(gdb) attach ваш_pid

После подключения программа станет на паузу, продолжаем ее выполнение командой:

(gdb) continue

segfault

Затем вам осталось только вызвать ошибку:

segfault1

И набрать команду, которая выведет стек последних вызовов:

(gdb) backtrace

Вывод этой команды и нужно отправлять разработчикам. Чтобы отключиться от программы и выйти наберите:

(gdb) detach
(gdb) quit

Дальше остается отправить отчет и ждать исправления ошибки. Если вы не уверены, что ошибка в программе, можете поспрашивать на форумах. Когда у вас есть стек вызовов, уже можно попытаться, если не понять в чем проблема, то попытаться узнать, не сталкивался ли с подобной проблемой еще кто-то.

Выводы

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

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Код ошибки sigsegv chromium
  • Код ошибки sigill chrome