릴리스 모드에서 .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.