2009-10-12 3 views
3

Windbg를 사용하여 관리 코드 (C#, 모든 CPU 용으로 작성된 콘솔 응용 프로그램)에서 크래시 덤프를로드하고 x64 플랫폼에서 크래시 덤프를 만듭니다. x64 플랫폼에서 디버깅 중입니다.개인 기호가로드되었지만 줄 번호가 표시되지 않았습니까?

내 응용 프로그램의 개인 기호를로드하려면 다음 명령을 사용하십시오. 다음은 Windbg에서 사용하는 명령입니다.

다음 명령을 사용할 때 스택 추적에 줄 번호 정보가 표시되지 않습니다. 어떤 아이디어가 잘못 되었나요? 소스 경로를 설정해야합니까?

0:016> ~6 e!clrstack 

편집 1 : 예외가 발생하는 스택 추적을 찾기 위해! pe 및! U를 사용하여 몇 가지 문제가 발생했습니다.

여기 내 디버그 프로세스입니다. 우선! U를 사용하여 예외 객체에 대한 스택 추적을 인쇄합니다!! U를 사용하여 코드를 분리합니다. 내가 찾은 문제는 다음과 같습니다! U는 FooService.ProcessOrders()의 모든 함수 코드를 분해하여 함수 FooService.ProcessOrders에서 충돌이 발생한 정확한 위치를 찾고자합니다. 또한 diassembled 주석이 달린 일리노이 코드 (예 : a * a * 2, 단지 어셈블리 언어가 표시됩니다 비 - 함수 호출 C# 코드에 대한), 정확히 일리노이 C# 코드의 각 줄에 매핑 된 함수 호출을 포함하는 찾을 1) 올바른 예상 동작입니까? (2) 여기에 게시 된 분석에서 실패한 C# 코드를 찾으려면 해결 방법이나 추가 제안은 무엇입니까? 사전에

!pe 0000064280155325 

StackTrace (generated): 
    SP    IP    Function 

    000000001A56DA70 00000642B74E3B7A System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(System.Data.Common.DbAsyncResult, System.String, Boolean) 
    000000001A56DB10 00000642B74E3FCC System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    000000001A56DB90 0000064280155325 FooService.ProcessOrders() 
    000000001A56F3E0 0000064280153A21 FooService.RountineJob() 

!U 0000064280155325 

감사, 조지

답변

5

WinDbg는/SOS는 !clrstack의 출력에 줄 번호를 매핑하지 않습니다. 따라서 lm이 자신의 어셈블리에 개인 pdb 심볼이 있음을 알리는 한 설정이 정확합니다. 불행하게도 현재 버전의 WinDbg/SOS는 원본 코드와 동일한 수준으로 소스 레벨 디버깅을 지원하지 않습니다.

편집 : 예외 사항. !pe을 수행하면 호출 스택뿐만 아니라 관련 메소드로의 오프셋을 알려줍니다. !pe 출력의 IP 열에서 주소를 가져 와서 !U을 수행하면 관련 메소드에 대한 JITTED 코드가 표시됩니다. IP 열은 예외를 생성 한 코드의 마지막 주소가됩니다 (올바른 명령을 찾기 위해 약간의 계산을해야합니다).

역 어셈블 된 출력은 .NET 호출로 주석 처리되므로 IL 또는 소스 코드와 매핑하기가 어렵지 않습니다. 그게 당신이 찾고있는 던져 진술을 정확하게 식별하는 데 도움이 될 것입니다.

즉, 메소드를 여러 가지 작은 메소드로 분할하면 디버깅을 훨씬 쉽게 할 수 있습니다. 그렇게하면 메서드 이름이 일반적으로 예외의 위치를 ​​정확하게 나타낼 수 있습니다. 나는 그것이 언제나 선택 사항이 아니라는 것을 알고 있지만, 고려 가치가 있습니다.

+0

고마워요! 내 응용 프로그램의 전체 소스 코드 (C# 관리 코드)가있는 크래시 덤프가있는 경우 Windbg를 사용하여 관리되는 코드 행에서 충돌 또는 중단되는 소스를 찾는 가장 쉬운 방법은 무엇입니까? Windbg가이 목표를 달성 할 수 없다면 다른 도구가 도움이 될 수 있습니까? – George2

+1

크래시로 처리되지 않은 예외에 대해 이야기하고있는 것으로 생각합니다. 이 경우 적절한 스레드에서 예외를 찾을 수 있습니다. ! threads 명령을 사용하여 관리되는 모든 스레드와 예외를 표시하십시오. ! pe 명령은 예외 오브젝트를 자세히 나열합니다. 자세한 내용은이 훌륭한 블로그 http://blogs.msdn.com/tess/ –

+0

을 참조하십시오. 예, 두뇌, 나는 처리되지 않은 예외에 대해 이야기하고 있습니다. 나는! pe를 사용하려고 시도했다!쓰레드들에 대해서는 약간의 정보를 제공하지만, 코드 (SqlException)의 예외는 내 코드의 특정 기능과 다른 몇 줄 (시나리오)에서 발생할 수 있습니다. 그리고! pe와! threads를 사용하면 예외가있는 함수를 알 수 있습니다. 그러나 함수가 다른 위치/시나리오에서 예외를 throw 할 수있는 경우 예외가 throw되는 위치를 나타내는 방법은 무엇입니까? – George2

관련 문제