¿Qué es el error de segmentación ?
– Es el error de tiempo de ejecución causado por la violación de acceso a la memoria. Por ejemplo: -Stackoverflow, lectura de violación, etc.
A menudo nos enfrentamos a este problema cuando trabajamos con punteros en c++/c.
En este ejemplo veremos cómo encontrar el error de segmentación en el programa. Encontraremos qué líneas causan el error de falla de segmentación.
Nota: – He usado la distribución de Linux – Ubuntu para esta demostración.
Entonces, considere el siguiente fragmento de código 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; }
¿Cómo encontrar ese error usando gdb?
Digamos que su nombre de archivo se guarda como Program1.cpp . Dirígete a tu terminal (Estar en el directorio en el que este Program1.cpp está disponible)
Paso 1: compilarlo. $gcc -g Program1.cpp
(en mi caso).
Paso 2: Ejecutarlo. $./a.out
(es un archivo de objeto)
Si muestra un error de segmentación (núcleo volcado), siga los pasos siguientes.
Paso 3: Depurarlo $gdb ./a.out core
Su resultado se verá así:
—————————————————————————————
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)
————————————————————————————
Luego simplemente escriba r y presione la tecla enter .
El resultado será algo como esto mostrando la declaración errónea.
———————————————————————————–
(gdb) r
Starting program: /home/logarithm/Desktop/Test Case/Miccl/a.out
Programa recibido señal SIGSEGV, Fallo de segmentación.
0x00005555555547de en principal() en Sege.cpp:8
8 *p=1;
(gdb)
—————————————————————————————
Ahora tienes la línea que causa el error de segmentación.
Salga del depurador y corrija el programa.
Para salir escriba quit y presione enter.
———————————————————————————–
(gdb) quit
A debugging session is active.
Inferior 1 [proceso 3617] será eliminado.
¿Renunciar de todos modos? (t o n) y
————————————————————————————–
Entonces, wow, has resuelto la falla de segmentación de tortura de cabeza.