GCC -g vs -g3 GDB Flag: Apa Perbedaannya?

102

Saat mengompilasi kode sumber C dengan gcc atau Clang, saya selalu menggunakan -gflag untuk menghasilkan informasi debugging untuk gdb.

gcc -g -o helloworld helloworld.c

Saya perhatikan bahwa beberapa orang merekomendasikan -g3sebagai gantinya. Apa perbedaan antara bendera -gdan -g3? Juga apakah ada perbedaan antara -gdan -ggdb?

haziz
sumber
15
Saya datang ke sini karena saya menggunakan makefile orang lain, dan dokumentasinya sangat luar biasa. Pertanyaan bagus untuk dimiliki di StackOverflow untuk menemukan jawaban yang mudah dari google.
GreenAsJade
Banyak sekali pertanyaan tentang SO yang "menutupi dokumentasi saya" selama Anda bersedia menggali cukup jauh. Itu bukan alasan yang sah untuk mengabaikan pertanyaan.
BeeOnRope

Jawaban:

104

Dari dokumen :

-g

Menghasilkan informasi debugging dalam format asli sistem operasi (stabs, COFF, XCOFF, atau DWARF 2). GDB dapat bekerja dengan informasi debugging ini. Pada kebanyakan sistem yang menggunakan format stabs, -g memungkinkan penggunaan informasi debugging tambahan yang hanya dapat digunakan GDB; informasi tambahan ini membuat debugging bekerja lebih baik di GDB tapi mungkin membuat debugger lain crash atau menolak untuk membaca program. Jika Anda ingin mengontrol dengan pasti apakah akan menghasilkan informasi tambahan, gunakan -gstabs +, -gstabs, -gxcoff +, -gxcoff, atau -gvms (lihat di bawah).

...


-ggdb

Menghasilkan informasi debugging untuk digunakan oleh GDB. Ini berarti menggunakan format paling ekspresif yang tersedia (DWARF 2, stabs, atau format asli jika tidak satu pun dari keduanya didukung), termasuk ekstensi GDB jika memungkinkan.


-gvmslevel

Minta informasi debugging dan juga gunakan level untuk menentukan berapa banyak informasi. Level default adalah 2. Level 0 tidak menghasilkan informasi debug sama sekali. Jadi, -g0 meniadakan -g.

....

Level 3 mencakup informasi tambahan, seperti semua definisi makro yang ada dalam program. Beberapa debugger mendukung ekspansi makro saat Anda menggunakan -g3.

MByD
sumber
8
Masih mungkin untuk menjelaskan apa perbedaan antara "format paling ekspresif" dan "informasi tambahan"? Apakah parameter ini gratis? Banyak dari mereka menyebutkan GDB ... Terima kasih!
rogerdpack
28

tl; dr: Untuk menjawab pertanyaan spesifik Anda, -g3"sertakan informasi tambahan seperti definisi makro ... Beberapa debugger mendukung perluasan makro saat Anda menggunakan -g3", sementara -gtidak menyertakan informasi tambahan ini.

Jawaban yang lebih luas adalah bahwa gcc mendukung empat tingkat informasi debug, dari -g0(informasi debug dinonaktifkan) hingga -g3(informasi debug maksimum).

Menentukan -gsama dengan -g2. Anehnya, dokumen gcc hanya menjelaskan sedikit tentang informasi -g/ -g2termasuk atau tidak termasuk:

Minta informasi debugging dan juga gunakan level untuk menentukan berapa banyak informasi. Level default adalah 2. Level 0 tidak menghasilkan informasi debug sama sekali. Jadi, -g0 meniadakan -g.

Level 1 menghasilkan informasi minimal, cukup untuk membuat jejak belakang di bagian program yang tidak Anda rencanakan untuk di-debug. Ini termasuk deskripsi fungsi dan variabel eksternal, dan tabel nomor baris, tetapi tidak ada informasi tentang variabel lokal.

Level 3 mencakup informasi tambahan, seperti semua definisi makro yang ada dalam program. Beberapa debugger mendukung ekspansi makro saat Anda menggunakan -g3.

U007D
sumber