2014-12-31 15 views
5

Bất cứ khi nào tôi nhận được một bãi chứa sụp đổ cho một bản phát hành x64 của ứng dụng của tôi, tôi thấy hiếm khi tôi có thể xem người dân địa phương, điều này gây khó khăn hoặc không thể khắc phục một số vấn đề. Trong x86 tôi thường có thể xem tất cả người dân địa phương mà không có bất kỳ vấn đề nào.Có bất kỳ tùy chọn trình biên dịch nào để tạo các bãi sụp đổ phát hành x64 dễ sử dụng hơn không?

Có bất kỳ tùy chọn trình biên dịch nào trong bản phát hành bản phát hành cho phép tôi xem người dân địa phương trong bản phát hành xây dựng bãi đổ vỡ không? Rõ ràng tôi không muốn tắt tối ưu hóa nhưng có lẽ có một số cách để buộc nó để cứu người dân địa phương với tác động hiệu suất nhỏ?

+0

Bạn có cân nhắc chuyển sang một số trình biên dịch khác như [GCC] (http://gcc.gnu.org/) hoặc [Clang/LLVM] (http://clang.llvm.org/) không? Bạn có thể biên dịch với cả thông tin gỡ lỗi và tối ưu hóa (ví dụ: 'g ++' hoặc 'clang' với' -O2 -g') –

+0

Người dân địa phương có xu hướng được tối ưu hóa, vì vậy không, bạn không thể "ăn bánh của bạn", nói chung. –

+1

Đừng mong đợi việc xây dựng/tối ưu hóa xây dựng để được gỡ lỗi thân thiện. x86_64 có nhiều thanh ghi hơn, do đó trình biên dịch sẽ không phải tràn nhiều biến vào bộ nhớ, đó có thể là một trong những lý do tại sao bạn không thấy các giá trị. –

Trả lời

10

Bạn đã biết một vài điều mà gợi ý tại sao bạn không thể nhìn thấy người dân địa phương ...

# 1 - Đó là một phát hành xây dựng.

Khi tối ưu hóa nhất định được bật, trình biên dịch được tự do thực hiện một vài điều khiến người dân địa phương gặp khó khăn hơn.

  1. Có thể inline một hàm. Khi điều này xảy ra, người dân địa phương của hàm không được tối ưu hóa sẽ được trộn lẫn với khung ngăn xếp gọi.
  2. Nó có thể giải phóng một thanh ghi và lưu một vài chu kỳ đồng hồ vào cuộc gọi hàm bằng cách sử dụng một mẹo gọi là Frame-Pointer Omission.
  3. Để tiết kiệm không gian ngăn xếp, trình biên dịch có thể reuse the location đã tổ chức một biến sớm hơn trong phần thân hàm để giữ một biến khác sau này trong hàm. Điều này có nghĩa là bạn đang ở đâu trong hàm xác định những người dân địa phương bạn thực sự có thể nhìn thấy.

# 2 - Đây là bản dựng x64.

MSVC sử dụng quy ước gọi điện mới cho mã 64 bit được gọi là x64 Calling Convention. 4 đối số hàm đầu tiên được lưu trong sổ đăng ký thay vì trên ngăn xếp. Điều này có nghĩa rằng mặc dù bạn đang xem một khung ngăn xếp, bạn sẽ không thấy một số đối số và thậm chí bạn không thể khôi phục chúng nếu sổ đăng ký đã được sử dụng lại cho một cái gì đó khác vào thời điểm bạn xem chúng.


Vì vậy, bây giờ những gì?

Bây giờ chúng tôi biết lý do tại sao bạn sẽ có một khoảng thời gian khó khăn như vậy, hãy xem bạn có thể làm gì để giải quyết các vấn đề trên. Không có vấn đề nào trong số những vấn đề đó thực sự là dấu hiệu cho thấy, nhưng tất cả chúng đều làm việc cùng nhau để làm mọi thứ khó khăn hơn cho bạn.

  1. Tắt một số tối ưu hóa. Bạn có thể thử tạo một bản phát hành với các tối ưu hóa ở mức không cản trở việc gỡ lỗi khá nhiều. Bạn có lẽ sẽ muốn bắt đầu với các tối ưu hóa được đề cập ở trên mà chơi với khung stack (/ Oy và/Ob). Sau đó, bạn sẽ cần phải hy vọng rằng bạn vẫn có thể tái tạo vấn đề với những tối ưu hóa tắt. Ngoài ra, tùy thuộc vào chính sách nội bộ và hợp đồng mà bạn có với khách hàng của mình, bạn có thể cần phải liên hệ với luật sư trước khi gửi một tòa nhà không chính thức cho khách hàng - có lẽ không phải là điều thú vị nhất trên thế giới.

  2. Tạo tệp biểu tượng tốt hơn. VS2012 trở lên có công tắc trình biên dịch mới, /d2Zi+ in VS2012/Zo in VS2013, tạo ra thông tin gỡ lỗi tốt hơn khi bật tối ưu hóa. Điều này đặt gỡ lỗi mã tối ưu ngang bằng với GCC/Clang. Mặc dù nó là không có giấy tờ trong VS2012, tôi vẫn sẽ xem xét nó khá an toàn vì tôi thấy không có sự khác biệt trong mã được tạo ra - chỉ trong tập tin biểu tượng. Bạn thậm chí có thể xây dựng lại cục bộ với cờ này và buộc windbg sử dụng tệp biểu tượng mới của bạn qua số .symopt+ 0x40. Điều này mang lại cho bạn một cơ hội để nhận được nhiều hơn từ các bãi mà bạn đã có.

  3. Sử dụng phần mở rộng windbg để thực hiện việc nâng hạng nặng. Trong other StackOverflow answers, tôi đã đề cập đến một công cụ gọi là CMKD đã lưu thịt xông khói của tôi một vài lần. Nó, trong số những thứ khác, cố gắng để tái tạo lại các đối số trong quy ước gọi x64 đã được thông qua trong sổ đăng ký. Nó không phải là một điều chắc chắn, nhưng nó có lẽ là hy vọng tốt nhất để đưa họ trở lại.

Dù sao, tôi hy vọng ramblings của tôi sẽ chứng minh hữu ích trong việc gỡ lỗi của bạn.

+0

CMKD dường như đang thực hiện công việc :) Tôi sẽ thử điều này/Tùy chọn Zo quá – paulm

+1

Bạn chắc chắn nên thêm/Zo để theo dõi người dân địa phương tốt hơn. Nó hoạt động đặc biệt tốt khi gỡ lỗi với windbg (nó cho thấy nội tuyến), nhưng nó cũng làm việc với VC++. Có một vài điều khoản - bài đăng trên blog của tôi bao gồm chúng: https://randomascii.wordpress.com/2013/09/11/debugging-optimized-codenew-in-visual-studio-2012/ –

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