Что вызывает SIGSEGV

Существует хорошая статья, которая объясняет, как представить те же данные различными шаблонами http://www.postneo.com/2006/07/26/acknowledging-the-mobile-web-with-django

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

33
задан Raedwald 2 April 2019 в 11:58
поделиться

4 ответа

Википедия , наряду с рядом других источников, дает ответ.

Ошибка сегментации означает, что вы сделали что-то плохое с указателями. Вероятно, это ошибка сегмента:

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

Или это:

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

Или, может быть, следующее:

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

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

51
ответ дан 27 November 2019 в 17:55
поделиться

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

12
ответ дан 27 November 2019 в 17:55
поделиться

Вот пример 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

А вот деталь .

Как с этим справиться?

  1. По возможности избегайте этого в то первое место.

    Программируйте защитно: используйте assert (), проверьте указатель NULL, проверьте переполнение буфера.

    Используйте инструменты статического анализа для проверки вашего кода.

    скомпилируйте ваш код с -Werror -Wall.

    ] Кто-нибудь проверяет ваш код.

  2. Когда это на самом деле произошло.

    Внимательно изучите ваш код.

    Проверьте, что вы изменили с момента последнего успешного выполнения кода без сбоев.

    Надеюсь, gdb предоставит вам стек вызовов, чтобы вы знали, где произошел сбой.


EDIT: извините за спешку. Это должно быть * p = 0x1234; вместо p = 0x1234 ;

4
ответ дан 27 November 2019 в 17:55
поделиться

с использованием недопустимого / нулевого указателя? Выход за границы массива? Трудно быть конкретным без какого-либо образца кода.

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

6
ответ дан 27 November 2019 в 17:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: