2010-02-11 42 views
7

Tôi đã tự hỏi nếu tôi có thể nhận danh sách tùy chọn gcc có thể khiến gdb hoạt động lạ.Tùy chọn GCC có thể gây ra sự cố khi gỡ lỗi với GDB

Tất nhiên, chúng ta đều biết rằng việc sử dụng các tùy chọn tối ưu hóa (ví dụ -O3) gây ra hành vi lạ trong gdb, nhưng các tùy chọn khác có thể có tác động như thế nào?

(tôi đang cố gắng để chạy một bộ giải mã mpeg2 trong gdb và tôi nhận được hành vi kỳ lạ ngay cả sau khi loại bỏ cờ tối ưu ...)

+0

Mô tả kỳ lạ. Bạn đã thêm -ggdb chưa? Và quan trọng nhất: Viết các tùy chọn bạn vẫn sử dụng. – ebo

+0

Chỉ sử dụng -g và -g3 rồi. Hành vi kỳ lạ trong trường hợp của tôi là một cái gì đó như thế này: một định nghĩa chức năng bắt đầu tại dòng 654, 'n' sau đó nhảy đến dòng 765, một 'n' nhảy trở lại dòng 654 và như vậy cho 4 hoặc 5 lần, tất nhiên, dòng 765 không phải là một trong đó phải là tiếp theo ... Nhưng ngay cả khi tôi đang tìm kiếm lá cờ gây ra vấn đề này ngay bây giờ, tôi tò mò về các tùy chọn khác nhau mà có thể gây ra hành vi kỳ lạ hơn nói chung. – claf

+0

Đối với các tùy chọn tôi vẫn đang sử dụng, có rất nhiều yên tĩnh, tôi đã không đăng chúng trong câu hỏi của tôi và làm cho nó tổng quát hơn để thay thế. – claf

Trả lời

9

Tôi nghĩ rằng thật khó để nói những gì cờ bạn should't sử dụng khi gọi gcc để gỡ lỗi. Các gcc docs lưu ý rằng các cờ gỡ lỗi mặc định là -g-O2 và việc sử dụng -g -O0 -fno-inline sẽ vô hiệu hóa bất kỳ tối ưu hóa và chức năng nội tuyến nào.

Theo ý kiến ​​của tôi, nếu bạn thực sự muốn bảo đảm rằng không có gì sẽ làm hỏng quá trình gỡ lỗi của bạn, bạn chỉ cần biên dịch với cờ -g -O0 -fno-inline.

+0

điều gì xảy ra nếu bạn có cùng một lúc -O3 cờ, một số cờ khác và "-g -O0 -fno-inline"? – user65636

+0

Tôi đã thực hiện một chương trình đơn giản và sử dụng -O3 -g -O0 -fno-inline -S và tôi đã có cùng một đầu ra của -g -O0 -fno-inline -S. Nhưng với -g -O0 -fno-inline -O3 -S đầu ra là khác nhau, trong trường hợp này, mã lắp ráp với -O3 lớn hơn mã được tạo mà không có -O3. Tôi không biết tác động của kết quả này. – coelhudo

+2

Không có gì ngạc nhiên khi -O0 ghi đè lên -O3 trong trường hợp đầu tiên. Trang manpage gcc cho biết: "Nếu bạn sử dụng nhiều tùy chọn -O, có hoặc không có số cấp, tùy chọn cuối cùng là tùy chọn hiệu quả." – bug313

0

Như đã nêu trong GCC documentation, bạn nên sử dụng -Og:

-Og

kinh nghiệm Optimize gỡ lỗi. -Og cho phép tối ưu hóa không can thiệp vào gỡ lỗi. Nó sẽ là mức độ tối ưu của sự lựa chọn cho chu trình sửa lỗi biên dịch chuẩn, cung cấp mức tối ưu hợp lý trong khi duy trì biên dịch nhanh và trải nghiệm gỡ lỗi tốt.

Nó cũng mô tả mọi cờ optmization và cách nó có thể ảnh hưởng đến gỡ lỗi.

+1

Về nguyên tắc có, trong thực tế '-O0' có thể thích hợp hơn –

Các vấn đề liên quan