Hiển thị số dòng trong Stack Trace cho .NET lắp ráp trong chế độ Phát hành


139

Có cách nào để hiển thị các dòng trong theo dõi ngăn xếp cho việc xây dựng / triển khai lắp ráp .NET trong chế độ Phát hành không?

CẬP NHẬT:

Ứng dụng của tôi được chia thành ba dự án thư viện lớp và một dự án "trang web" ASP.NET. Lỗi tôi đang cố gắng theo dõi là ở một trong ba dự án thư viện lớp. Tôi chỉ triển khai tệp pdb cho dự án thư viện lớp đang tạo ra lỗi "Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng".

Các số dòng vẫn không hiển thị trong theo dõi ngăn xếp. Tôi có cần triển khai các tệp pdb cho tất cả các dự án để lấy số dòng trong theo dõi ngăn xếp không?

Giải pháp làm việc

Việc triển khai tệp pdb cho mỗi ứng dụng đã khắc phục sự cố số dòng.

Câu trả lời:


147
  • Đi vào cửa sổ Thuộc tính cho dự án nơi bạn muốn xem số dòng theo dõi ngăn xếp.
  • Nhấp vào Build "tab dọc".
  • Chọn cấu hình "Phát hành". Kiểm tra tham số hằng DEBUG.
  • Bỏ chọn tham số "Tối ưu hóa mã" để tránh sự cố theo dõi thỉnh thoảng với mã được in (bước này không cần thiết).
  • Nhấn nút Nâng cao ... và chọn Đầu ra -> Thông tin gỡ lỗi -> chỉ pdb.
  • Triển khai tệp .pdb được tạo với cụm.

Thực hiện với các bình luận dưới đây:

  • Một điều khác để kiểm tra là trong phần "Gói / Xuất bản Web" mà hộp kiểm "Loại trừ các biểu tượng gỡ lỗi được tạo" cũng không được chọn

2
Tôi có phải triển khai tệp pdb cùng với lắp ráp không?
Michael Kniskern

7
Đúng. Đó là nơi có các ký hiệu gỡ lỗi và số dòng.
John Saunders

5
Bạn có thể không muốn tiết lộ thông tin này nếu bạn không phải làm vậy. Sử dụng nó để gỡ lỗi một vấn đề của khách hàng, vâng. Nhưng bạn không phải lúc nào cũng muốn làm điều đó vì thông tin gỡ lỗi có thể cho đi dữ liệu nhạy cảm và là một vectơ tấn công. Tùy thuộc vào ứng dụng của bạn là gì.
i_am_jorf

6
@Carlo: Thông tin gỡ lỗi cũng hoạt động với mã phát hành (được tối ưu hóa), tuy nhiên việc gỡ lỗi có phần bị hạn chế ( stackoverflow.com/questions/113866 ). Tuy nhiên, các cuộc gọi là khá đáng tin cậy ngay cả trong mã được tối ưu hóa, ngoại trừ các hàm được nội tuyến và các tình huống theo phương pháp trong đó có thể thiếu cuộc gọi đuôi vì chuỗi cuộc gọi xxx / ret đã được thay thế bằng jmp xxx.
Suma

12
Một điều khác cần kiểm tra là trong phần "Gói / Xuất bản Web" rằng hộp kiểm "Loại trừ các biểu tượng gỡ lỗi được tạo" cũng không được chọn
Gaz

17

Trong VS2012, bạn cần bỏ chọn "Loại trừ các ký hiệu gỡ lỗi được tạo" trong phần Gói / Xuất bản Web của các thuộc tính.


hoặc nếu đó là một ứng dụng dành cho máy tính để bàn, hãy đảm bảo tệp PDB được triển khai
CAD bloke


9

Tôi đã gặp vấn đề trong quá khứ khi tôi cảm thấy cần phải triển khai các tệp PDB với bản dựng phát hành để theo dõi lỗi. Lý do là, như bạn đã nói, là ngoại lệ xảy ra trong một phương thức rất lớn và tôi không thể xác định chính xác nơi nó đang xảy ra.

Đây có thể là một dấu hiệu cho thấy phương thức cần được tái cấu trúc thành các phương thức nhỏ hơn, chi tiết hơn. Không phải là một kích thước phù hợp với tất cả câu trả lời, nhưng cách tiếp cận này đã phục vụ tốt cho tôi trong thời gian ngắn (tôi thường tìm thấy lỗi trong quá trình tái cấu trúc) và về lâu dài.

Chỉ là một ý nghĩ.


Điều này. Và khi bạn đi, ném thử bắt ở những nơi sơ sài hơn ở một hạt mịn hơn. Và tăng các vệ sĩ khi bắt đầu các chức năng này nếu các giả định phải được thực hiện.
Gerard ONeill

Thường được nói và rất đúng, tuy nhiên, có di sản, có những lập trình viên viết các phương thức lớn mới và đôi khi một phương thức lớn thực sự là điều tốt nhất để làm (tách nó là khó hiểu hoặc YAGNI). Ngoài ra, ngay cả đối với phương pháp 5 dòng - bạn thu hẹp tìm kiếm 5x của mình - vì vậy PDB là một điều ác cần thiết trong sản xuất trừ khi bạn chịu khó sử dụng máy chủ biểu tượng
FastAl

3

Bao gồm các biểu tượng gỡ lỗi với gói xây dựng / triển khai của bạn.


0

Trong VS 2008 Express, tôi đã tìm thấy nó trong Project Properties -> Compile -> Advanced Compile Options.


1
Bạn đã tìm thấy gì? Bạn có thể đăng bình luận nếu bạn không muốn đăng câu trả lời hoàn chỉnh.
jumxozizi

-4

Điều này hoạt động mọi lúc. Bạn chỉ cần xâu chuỗi tin nhắn theo dõi ngăn xếp. Thật dễ dàng! Ngoài ra, trong vb.net, bạn cần phải thực hiện "Hiển thị tất cả các tệp" và bao gồm pdb.

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

Phiên bản C #:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
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.