GCC -g vs -g3 GDB Flag: Sự khác biệt là gì?


102

Khi biên dịch mã nguồn C với gcc hoặc Clang, tôi luôn sử dụng -gcờ để tạo thông tin gỡ lỗi cho gdb.

gcc -g -o helloworld helloworld.c

Tôi nhận thấy rằng một số người đề xuất -g3thay thế. Sự khác biệt giữa cờ -g-g3cờ là gì? Ngoài ra có sự khác biệt giữa -g-ggdb?


15
Tôi đến đây bởi vì tôi đang sử dụng makefile của người khác và tài liệu này là một điều thú vị để bắt đầu. Câu hỏi hay cần có trên StackOverflow để tìm câu trả lời dễ dàng từ google.
GreenAsJade 23/09/15

Một số lượng lớn các câu hỏi trên SO được "bao gồm tài liệu của tôi" miễn là bạn sẵn sàng tìm hiểu đủ xa. Đó không phải là lý do hợp lệ để loại bỏ một câu hỏi.
BeeOnRope

Câu trả lời:


104

Từ các tài liệu :

-g

Tạo thông tin gỡ lỗi ở định dạng gốc của hệ điều hành (stt, COFF, XCOFF hoặc DWARF 2). GDB có thể làm việc với thông tin gỡ lỗi này. Trên hầu hết các hệ thống sử dụng định dạng stt, -g cho phép sử dụng thêm thông tin gỡ lỗi mà chỉ GDB mới có thể sử dụng; thông tin bổ sung này giúp gỡ lỗi hoạt động tốt hơn trong GDB nhưng có thể khiến các trình gỡ lỗi khác gặp sự cố hoặc từ chối đọc chương trình. Nếu bạn muốn kiểm soát chắc chắn liệu có tạo thêm thông tin hay không, hãy sử dụng -gstabs +, -gstabs, -gxcoff +, -gxcoff hoặc -gvms (xem bên dưới).

...


-ggdb

Tạo thông tin gỡ lỗi để GDB sử dụng. Điều này có nghĩa là sử dụng định dạng biểu cảm nhất có sẵn (DWARF 2, stt hoặc định dạng gốc nếu cả hai đều không được hỗ trợ), bao gồm cả phần mở rộng GDB nếu có thể.


-gvmslevel

Yêu cầu thông tin gỡ lỗi và cũng sử dụng mức độ để chỉ định lượng thông tin. Mức mặc định là 2. Mức 0 không tạo ra thông tin gỡ lỗi nào cả. Do đó, -g0 phủ định -g.

....

Cấp độ 3 bao gồm thông tin bổ sung, chẳng hạn như tất cả các định nghĩa vĩ mô có trong chương trình. Một số trình gỡ lỗi hỗ trợ mở rộng macro khi bạn sử dụng -g3.


8
Vẫn có thể giải thích sự khác biệt giữa "định dạng biểu cảm nhất" và "thông tin bổ sung" là gì? Các thông số này có bổ sung không? Nhiều người trong số họ đề cập đến GDB ... Cảm ơn!
rogerdpack

28

tl; dr: Để trả lời câu hỏi cụ thể của bạn, -g3"bao gồm thông tin bổ sung như định nghĩa macro ... Một số trình gỡ lỗi hỗ trợ mở rộng macro khi bạn sử dụng -g3", trong khi -gkhông bao gồm thông tin bổ sung này.

Câu trả lời rộng hơn là gcc hỗ trợ bốn cấp độ thông tin gỡ lỗi, từ -g0(thông tin gỡ lỗi bị vô hiệu hóa) đến -g3(thông tin gỡ lỗi tối đa).

Chỉ định -gtương đương với -g2. Thật kỳ lạ, các tài liệu gcc nói rất ít về những thông tin -g/ -g2bao gồm hoặc loại trừ:

Yêu cầu thông tin gỡ lỗi và cũng sử dụng mức độ để chỉ định lượng thông tin. Mức mặc định là 2. Mức 0 không tạo ra thông tin gỡ lỗi nào cả. Do đó, -g0 phủ định -g.

Mức 1 tạo ra thông tin tối thiểu, đủ để tạo dấu vết trong các phần của chương trình mà bạn không định gỡ lỗi. Điều này bao gồm các mô tả về hàm và các biến bên ngoài, và bảng số dòng, nhưng không có thông tin về các biến cục bộ.

Cấp độ 3 bao gồm thông tin bổ sung, chẳng hạn như tất cả các định nghĩa vĩ mô có trong chương trình. Một số trình gỡ lỗi hỗ trợ mở rộng macro khi bạn sử dụng -g3.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.