GNU/Linux >> Belajar Linux >  >> Linux

Cara termudah untuk menemukan Kesalahan Segmentasi

+1 untuk jawaban Tibors.

Pada program yang lebih besar atau jika Anda menggunakan pustaka tambahan, mungkin juga berguna lihat backtrace dengan gdb:ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_42.html


Gunakan debugger, seperti gdb atau jika ini tidak berlaku strace alat untuk mendapatkan wawasan yang lebih baik tentang di mana segfault terjadi.

Jika Anda menggunakan gcc , pastikan Anda mengkompilasi dengan -g beralih untuk memasukkan informasi debug. Lalu, gdb akan menunjukkan kepada Anda lokasi yang tepat dalam kode sumber di mana segfault.

Misalnya, jika kita memiliki program segfaulty yang jelas ini:

baru.c

#include <stdio.h>

int main()
{
        int *i = 0x478734;
        printf("%d", *i);
}

Kami mengkompilasinya dengan gcc -g new.c -o new lalu jalankan gdb sesi dengan gdb new :

Kami menerbitkan run perintah dalam sesi interaktif dan yang lainnya jelas:

(gdb) run
Starting program: /home/Tibor/so/new
[New Thread 9596.0x16a0]
[New Thread 9596.0x1de4]

Program received signal SIGSEGV, Segmentation fault.
0x0040118a in main () at new.c:6
6               printf("%d", *i);
(gdb)

Seperti yang ditunjukkan oleh DasMoeh dan netcoder, ketika segfault terjadi, Anda dapat menggunakan backtrace perintah dalam sesi interaktif untuk mencetak tumpukan panggilan. Ini dapat membantu dalam menentukan lebih jauh lokasi segfault.


Cara termudah adalah dengan menggunakan valgrind . Ini akan menunjuk ke lokasi di mana akses tidak valid terjadi (dan masalah lain yang tidak menyebabkan crash tetapi masih tidak valid). Tentu saja masalah sebenarnya bisa berada di tempat lain dalam kode (misalnya:pointer tidak valid), jadi langkah selanjutnya adalah memeriksa sumbernya, dan jika masih bingung, gunakan debugger.


Linux
  1. Apache2 configtest gagal:Kesalahan segmentasi (core dibuang) [Diselesaikan]

  2. Flameshot – Cara termudah untuk Mengambil dan Membuat Anotasi pada Tangkapan Layar

  3. RDP Linux ke Windows:Cara Termudah 2019!

  1. Apakah ada cara untuk mengubah variabel lingkungan dari proses lain di Unix?

  2. Mengapa fclose(NULL) glibc menyebabkan kesalahan segmentasi alih-alih mengembalikan kesalahan?

  3. Kesalahan segmentasi saat Qt QApplication dibuat dengan yang baru

  1. Instal Zabbix di Ubuntu 18.04:Cara Termudah &Tercepat!

  2. Apa cara termudah untuk mengendus data lalu lintas TCP di Linux?

  3. Apa cara termudah untuk membuat paket virtual di debian?