2012-02-03 17 views
28

Tôi đang sử dụng gdb để gỡ lỗi chương trình C++.Làm cách nào để xem giá trị của biến <được tối ưu hóa> trong C++?

tôi có mã này:

int x = floor(sqrt(3)); 

và tôi muốn để xem các giá trị của x. Tuy nhiên, gdb tuyên bố rằng x là "< optimize_out>". Làm cách nào để xem giá trị của x? Tôi có nên thay đổi cờ biên dịch của mình không?

+2

Cần có sẵn nếu bạn biên dịch mà không tối ưu hóa tức là -O0 –

+4

Có, bạn thường nên gỡ lỗi mã bằng cách tối ưu hóa * đã tắt *. Sử dụng cờ '-O0' cho điều đó. –

Trả lời

33

Ở mức tối ưu hóa cao, trình biên dịch có thể loại bỏ các giá trị trung gian, như bạn đã thấy ở đây. Có một số tùy chọn:

  • Bạn có thể giảm mức tối ưu hóa để giúp trình gỡ lỗi theo dõi mọi thứ dễ dàng hơn. -O0 chắc chắn hoạt động (nhưng sẽ chậm hơn rất nhiều), -O1 cũng có thể hoạt động tốt.
  • Bạn có thể thêm một số câu lệnh in rõ ràng để ghi lại giá trị đầu ra.
  • Bạn cũng có thể buộc trình biên dịch giữ lại giá trị cụ thể này bằng cách làm cho nó dễ bay hơi (nhưng hãy nhớ để un-làm cho nó dễ bay hơi khi bạn hoàn tất!). Tuy nhiên, lưu ý rằng vì luồng điều khiển cũng có thể bị thay đổi trong mã được tối ưu hóa, ngay cả khi bạn có thể thấy giá trị của biến, có thể không hoàn toàn rõ ràng về điểm nào trong mã bạn đang sử dụng khi bạn xem biến trong câu hỏi.
+3

Bạn thường có thể tháo rời hàm và suy ra những gì đăng ký biến "tối ưu hóa" thực sự nằm trong và in biến đó. Có những nỗ lực phát triển theo cách để làm cho GCC phát ra thông tin gỡ lỗi đầy đủ chi tiết để GDB trong tương lai có thể làm điều này cho bạn. –

+1

@EmployedRussian, điều này có thể hoạt động nếu biến trên thực tế tồn tại, nhưng có thể cho công việc thực tế của việc tính toán biến được loại bỏ, vì vậy nó không hoạt động trong mọi trường hợp. – bdonlan

+0

Cũng có thể cho một biến cục bộ chỉ tồn tại trong sổ đăng ký. 'gcc' có thể tối ưu hóa mã của bạn theo cách này - một nguyên nhân có thể khác cho các biến không thể xem được. Xem câu trả lời này để biết cách xem các biến đăng ký: http://stackoverflow.com/a/1354762/350875 – appas

13

Nếu bạn không thể hoặc không muốn tắt tối ưu hóa, thì bạn có thể thử khai báo biến là biến động. Điều này thường đủ để làm cho trình biên dịch của bạn bảo toàn biến trong mã cuối cùng.

Ngoài ra, trong các phiên bản GCC gần đây bạn có thể vô hiệu hóa tối ưu hóa cho chỉ là một chức năng, như thế này:

void my_function() __attribute__((optimize(0))) 
{ 
    int x = floor(sqrt(3)); 
} 
+0

Đối với tôi, thuộc tính này không xác định. Khi tôi sử dụng 'optnone' thay vào đó, biến được tối ưu hóa bất kể (clang 3.8). – starturtle

0

Tạo riêng 'biến toàn cầu' của bạn và in biến tối ưu hóa ra vào biến toàn cầu này. Hãy chắc chắn để loại bỏ các globals được tạo ra bởi bạn sau khi bạn đang thực hiện với gỡ lỗi!

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