2009-06-01 36 views
7

Có thể cho trình gỡ lỗi (hoặc trình xử lý ngoại lệ CLR) hiển thị dòng nơi ngoại lệ xảy ra trong chế độ Phát hành bằng cách sử dụng pdb không?Lấy số dòng từ pdb trong chế độ phát hành

Mã, ở chế độ phát hành, được tối ưu hóa và không luôn tuân theo thứ tự và logic của mã "gốc". Một số điều đáng ngạc nhiên là trình gỡ lỗi có thể điều hướng qua từng bước mã của tôi, ngay cả trong chế độ Phát hành. Việc tối ưu hóa nên làm cho việc điều hướng trở nên rất bất tiện.

Bạn có thể làm rõ hai điểm đó cho tôi không?

Trả lời

10

Tôi không quen với cách thực hiện điều này với CLR, nhưng có thể nó rất giống với cách thực hiện với mã gốc. Khi trình biên dịch tạo ra các lệnh máy, nó thêm các mục vào pdb mà về cơ bản là "lệnh tại địa chỉ hiện tại, X, đến từ dòng 25 trong foo.cpp".

Trình gỡ lỗi biết địa chỉ chương trình nào hiện đang thực thi. Vì vậy, nó tìm kiếm một số địa chỉ, X, trong pdb và thấy rằng nó đến từ dòng 25 trong foo.cpp. Sử dụng điều này, nó có thể "bước" qua mã nguồn của bạn.

Quá trình này giống nhau bất kể chế độ gỡ lỗi hoặc chế độ phát hành (miễn là một pdb được tạo ở tất cả trong chế độ Phát hành). Tuy nhiên, bạn đúng, thường ở chế độ phát hành do tối ưu hóa trình gỡ lỗi sẽ không bước "tuyến tính" qua mã. Nó có thể nhảy xung quanh với những dòng khác nhau bất ngờ. Điều này là do trình tối ưu hóa thay đổi thứ tự các lệnh, nhưng nó không thay đổi ánh xạ địa chỉ-nguồn-dòng, do đó trình gỡ rối vẫn có thể theo dõi nó.

+0

Ty cho câu trả lời chi tiết của bạn. Mọi thứ giờ đã rõ ràng đối với tôi. –

0

Trình gỡ lỗi thực hiện dự đoán nỗ lực tốt nhất tại nơi xảy ra sự cố. Nó không được đảm bảo chính xác 100%, và với mã được tối ưu hóa hoàn toàn, nó thường sẽ không chính xác - Tôi đã tìm thấy những điểm không chính xác ở bất kỳ đâu từ một vài dòng để có một cuộc gọi hoàn toàn sai.

Trình gỡ lỗi chính xác với mã được tối ưu hóa thực sự phụ thuộc vào chính mã đó và tối ưu hóa bạn đang thực hiện như thế nào.

+1

Ty. "để có ngăn xếp cuộc gọi hoàn toàn sai". dấu vết ngăn xếp không nên luôn chính xác? –

+0

Có nguồn hoặc thông tin nào khác về số dòng bị tắt không? Tôi đã đỏ một số bài viết về SO trên gỡ lỗi/pdb/tối ưu hóa mã trình biên dịch, và thấy không có điểm rõ ràng về điều này. – gerleim

1

[@Not chắc] có nó gần như ngay. Trình biên dịch cố gắng hết sức để xác định một số dòng thích hợp phù hợp chặt chẽ với hướng dẫn mã máy hiện tại.

PDB và trình gỡ lỗi không biết gì về tối ưu hóa; tệp PDB cơ bản ánh xạ các vị trí địa chỉ trong mã máy tới các số dòng mã nguồn. Trong mã được tối ưu hóa, không phải lúc nào cũng có thể khớp chính xác lệnh ghép nối với một dòng mã nguồn cụ thể, do đó trình biên dịch sẽ ghi vào PDB thứ gần nhất mà nó có trong tay. Điều này có thể là "dòng mã nguồn trước" hoặc "dòng mã nguồn của ngữ cảnh kèm theo (vòng lặp, v.v.)" hoặc một cái gì đó khác.

Bất kể, trình gỡ lỗi về cơ bản tìm thấy mục nhập trong bản đồ PDB gần nhất (như trong "trước hoặc bằng") với IP hiện tại (Hướng dẫn Pointer) và làm nổi bật dòng đó.

Đôi khi kết quả trùng khớp không tốt lắm, và đó là khi bạn nhìn thấy khu vực được đánh dấu nhảy qua khắp nơi.

+1

Có thể trình biên dịch tạo ra một pdb khác nhau để phát hành và cho chế độ gỡ lỗi. Các pdb cho chế độ phát hành có trong xem xét tối ưu hóa, do đó, nó có thể cung cấp cho một dòng tương đối chính xác cho một ngoại lệ. –

+0

Ồ, tuyệt đối. PDB là vĩnh viễn gắn liền với cùng một trường hợp chính xác của DLL (hoặc EXE) mà nó được xây dựng. Lưu ý rằng ngay cả khi bạn biên dịch lại trong cùng một chế độ, mà không có bất kỳ thay đổi tập tin nguồn, bạn vẫn không thể trộn và kết hợp các PDB và DLL. PDB của bạn phải giống chính xác được tạo ra khi mô-đun (DLL hoặc EXE) mà bạn đang gỡ lỗi được biên dịch bởi vì trình biên dịch có thể ngẫu nhiên đặt công cụ ở các vị trí khác nhau trên mỗi bản dựng. Đó có phải là những gì bạn đang cố gắng làm không? –

+0

@Euro Micelli:> trình biên dịch ngẫu nhiên có thể đặt nội dung ở các vị trí khác nhau trên mỗi bản dựng <Điều đó nghe với tôi như một công thức cho thảm họa. Tôi chưa bao giờ thấy một thứ như vậy trong thực tế. Điều này chỉ xảy ra khi sử dụng các công cụ của Microsoft? Hoặc .NET? Trong mọi trường hợp mà tôi đã có kinh nghiệm, trình biên dịch sẽ luôn tạo ra kết quả bit-bit tương tự chính xác từ một đầu vào đã cho. Bất cứ điều gì khác sẽ rất nghi ngờ (bạn có thể nói "xây dựng không thể sản xuất" ??) –

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