릴리스 모드에서 .NET 어셈블리의 스택 추적에 행 번호 표시


139

릴리스 모드에서 빌드 / 배포 된 .NET 어셈블리의 스택 추적에 행을 표시하는 방법이 있습니까?

최신 정보:

내 응용 프로그램은 3 개의 클래스 라이브러리 프로젝트와 하나의 ASP.NET "웹 사이트"프로젝트로 나뉩니다. 내가 추적하려고하는 오류는 세 가지 클래스 라이브러리 프로젝트 중 하나에 있습니다. "개체 참조가 개체의 인스턴스로 설정되지 않았습니다"오류를 생성하는 클래스 라이브러리 프로젝트에 대한 pdb 파일 만 배포했습니다.

줄 번호는 여전히 스택 추적에 표시되지 않습니다. 스택 추적에서 줄 번호를 얻으려면 모든 프로젝트에 pdb 파일을 배포해야합니까?

작업 솔루션

각 응용 프로그램에 대해 pdb 파일을 배포하면 줄 번호 문제가 해결되었습니다.

답변:


147
  • 스택 추적 행 번호를 보려는 프로젝트의 속성 창으로 이동하십시오.
  • "수직 탭"빌드를 클릭하십시오.
  • "릴리스"구성을 선택하십시오. DEBUG 상수 매개 변수를 확인하십시오.
  • 인라인 코드에서 가끔 발생하는 추적 문제를 피하려면 "코드 최적화"매개 변수를 선택 취소하십시오 (이 단계는 필수는 아닙니다).
  • 고급 ... 단추를 누르고 출력-> 디버그 정보-> pdb 전용을 선택하십시오.
  • 생성 된 .pdb 파일을 어셈블리와 함께 배포하십시오.

아래 주석으로 구현되었습니다.

  • 확인해야 할 또 다른 사항은 "패키지 / 게시 웹"섹션에서 "생성 된 디버그 기호 제외"확인란도 선택하지 않은 것입니다.

2
어셈블리와 함께 pdb 파일을 배포해야합니까?
— Michael Kniskern

7
예. 그곳에서 디버그 기호와 줄 번호가 있습니다.
— John Saunders

5
필요하지 않은 경우이 정보를 노출하고 싶지 않을 것입니다. 클라이언트 문제를 디버깅하는 데 사용하십시오. 그러나 디버깅 정보가 중요한 데이터를 제공하고 공격 경로가 될 수 있기 때문에 항상 원하지는 않습니다. 앱이 무엇인지에 따라 다릅니다.
— i_am_jorf

6
@Carlo : 디버그 정보는 릴리스 (최적화 된) 코드에서도 작동하지만 디버깅은 다소 제한적입니다 ( stackoverflow.com/questions/113866 ). 그러나 콜 스택은 인라인 함수 및 콜 xxx / ret 시퀀스가 ​​jmp xxx로 대체되어 테일 콜이 누락 될 수있는 상황을 제외하고는 최적화 된 코드에서도 매우 안정적입니다.
— Suma

12
확인해야 할 또 다른 사항은 "패키지 / 게시 웹"섹션에서 "생성 된 디버그 기호 제외"확인란도 선택하지 않은 것입니다.
— Gaz

17

VS2012에서는 속성의 패키지 / 게시 웹 섹션에서 "생성 된 디버그 심볼 제외"를 선택 취소해야합니다.


또는 데스크톱 앱인 경우 PDB 파일이 배포되었는지 확인하십시오.
— CAD


9

과거에는 오류를 추적하기 위해 릴리스 빌드로 PDB 파일을 배포해야한다고 생각하는 문제가 발생했습니다. 그 이유는 당신이 말했듯이 예외가 매우 큰 방법으로 발생했기 때문에 예외가 발생하는 곳을 정확하게 지적 할 수 없었기 때문입니다.

이는 방법을 더 작고 세분화 된 방법으로 리팩토링해야 함을 나타낼 수 있습니다. 하나의 크기가 모든 대답에 맞지는 않지만이 접근법은 단기적으로 (리팩토링 중에 버그를 자주 발견했습니다) 장기적으로 도움이되었습니다.

그냥 생각이야


이. 그리고 갈수록 더 미세한 곡물로 더 스케치 된 장소에서 캐치를 시도하십시오. 가정해야 할 경우 이러한 기능의 시작 부분에서 보호대를 늘리십시오.
— Gerard ONeill

그러나 종종 레거시가 있으며 새로운 대형 메소드를 작성하는 프로그래머가 있으며 때로는 대형 메소드가 실제로 수행하는 가장 좋은 방법입니다 (혼란 또는 YAGNI를 분리). 또한 5 줄 방식의 경우에도 검색 범위를 5
— 배로 좁 힙니다.


0

VS 2008 Express에서는 프로젝트 속성-> 컴파일-> 고급 컴파일 옵션에서 찾았습니다.


1
무엇을 찾았습니까? 완전한 답변을 게시하지 않으려면 의견을 게시 할 수 있습니다.
— jumxozizi

-4

이것은 매번 작동합니다. 스택 추적 메시지를 서브 스트링해야합니다. 진짜 쉬워요! 또한 vb.net에서는 "모든 파일 표시"를 수행하고 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

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++;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.