Как найти ошибку сегментации в C и C ++? (Используя GDB)

Опубликовано: 30 Декабря, 2021

Что такое ошибка сегментации?
- Это ошибка времени выполнения, вызванная нарушением доступа к памяти. Например: -Stackoverflow, прочтите нарушение и т. Д.
Мы часто сталкиваемся с этой проблемой при работе с указателями в c ++ / c.
В этом примере мы увидим, как найти ошибку сегментации в программе. Мы найдем, какие строки вызывают ошибку ошибки сегментации.
Примечание: - Я использовал дистрибутив Linux - Ubuntu для этой демонстрации.
Итак, рассмотрим следующий фрагмент кода C ++.

// Segmentation Error Demonstration
// Author - Rohan Prasad
#include <iostream>
using namespace std;
int main()
{
int * p = NULL;
// This lines cause the segmentation
// error because of accessing the
// unknown memory location.
*p = 1;
cout << *p;
return 0;
}


Как найти эту ошибку с помощью gdb?

Допустим, ваше имя файла сохранено как Program1.cpp . Направляйтесь к своему терминалу (будьте в каталоге, в котором доступен этот Program1.cpp)

Шаг 1. Скомпилируйте его.
$ gcc -g Program1.cpp (в моем случае).
Шаг 2: Запустите.
$ ./a.out (это объектный файл)
Если отображается ошибка сегментации (дамп ядра), выполните следующие действия.
Шаг 3. Выполните отладку
$ gdb ./a.out core
Ваш результат будет выглядеть примерно так:
—-----

GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
.
Find the GDB manual and other documentation resources online at:
.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./a.out...done.
/home/logarithm/Desktop/Test Case/Miccl/core: No such file or directory.
(gdb)

—-----
Затем просто введите r и нажмите клавишу ввода.
Результат будет примерно таким, показывающим ошибочное утверждение.
—-----

(gdb) r
Starting program: /home/logarithm/Desktop/Test Case/Miccl/a.out

Программа получила сигнал SIGSEGV, Ошибка сегментации.
0x00005555555547de в main () на Sege.cpp: 8
8 * р = 1;
(GDB)

—-----
Теперь у вас есть строка, вызывающая ошибку сегментации.
Выйдите из отладчика и исправьте программу.
Для выхода введите quit и нажмите Enter.
—-----

(gdb) quit
A debugging session is active.

Нижний 1 [процесс 3617] будет убит.

Все равно выйти? (y или n) y


—-----
Итак, вау, вы устранили ошибку сегментации, которая мучила голову.

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