문제

컴퓨터 디버깅의 복잡성을 이제 막 배우기 시작한 사람으로서 저는 Windbg에서 덤프의 스택 텍스트를 읽는 방법을 이해할 수 없습니다.나는 그것들을 해석하는 방법이나 그것에 대해 어떻게 진행해야 할지에 대해 어디서부터 시작해야 할지 전혀 모릅니다.이 불쌍한 영혼에게 방향을 제시할 수 있는 사람이 있습니까?

즉 (실제로 제가 가지고 있는 유일한 쓰레기장입니다)

>b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94

b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255

b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0

b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000

문제가 Nvidia 디스플레이 드라이버와 관련이 있다는 것을 알고 있지만, 제가 알고 싶은 것은 실제로 스택을 읽는 방법입니다(예: b69dd8f4가 무엇입니까?) :-[

도움이 되었습니까?

해결책

먼저, 적절한 기호를 구성해야 합니다.기호를 사용하면 메모리 주소를 함수 이름과 일치시킬 수 있습니다.이렇게 하려면 기호의 로컬 캐시를 저장할 컴퓨터에 로컬 폴더를 만들어야 합니다(예:C:\기호).그런 다음 기호 서버 경로를 지정해야 합니다.이렇게 하려면 다음으로 이동하세요.파일 > 기호 파일 경로 및 유형:

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

기호를 올바르게 구성하는 방법에 대한 자세한 정보를 찾을 수 있습니다. 여기.

Symbols 서버를 올바르게 구성한 후에는 다음에서 미니덤프를 열 수 있습니다.파일 > 크래시 덤프 열기.

미니덤프가 열리면 덤프가 생성될 때 실행 중이던 스레드가 명령줄 왼쪽에 표시됩니다.이 스레드가 실행 중인 내용을 보려면 다음을 입력하세요.

kpn 200

처음으로 필요한 공개 Microsoft 관련 기호를 다운로드해야 하므로 처음 실행하는 데 시간이 걸릴 수 있습니다.모든 기호가 다운로드되면 다음과 같은 결과가 나타납니다.

01 MODULE!CLASS.FUNCTIONNAME1(...)
02 MODULE!CLASS.FUNCTIONNAME2(...)
03 MODULE!CLASS.FUNCTIONNAME3(...)
04 MODULE!CLASS.FUNCTIONNAME4(...)

어디:

  • 첫 번째 숫자:프레임 번호를 나타냅니다.
  • 기준 치수:코드가 포함된 DLL
  • 수업:(C++ 코드에만 해당) 코드가 포함된 클래스가 표시됩니다.
  • 기능 이름:호출된 메서드입니다.올바른 기호가 있으면 매개변수도 표시됩니다.

다음과 같은 내용을 볼 수도 있습니다.

01 MODULE!+989823

이는 이 DLL에 대한 적절한 기호가 없으므로 메서드 오프셋만 볼 수 있음을 나타냅니다.

그렇다면 콜스택이란 무엇일까요?

다음 코드가 있다고 상상해 보세요.

void main()
{
  method1();
}

void method1()
{
  method2();
}

int method2()
{
  return 20/0;
}

이 코드에서 method2는 기본적으로 0으로 나누려고 하기 때문에 예외를 발생시키며 이로 인해 프로세스가 중단됩니다.이 문제가 발생했을 때 미니덤프를 얻은 경우 다음과 같은 콜스택이 표시됩니다.

01 MYDLL!method2()
02 MYDLL!method1()
03 MYDLL!main()

이 호출 스택에서 "main"이 "method1"을 호출한 후 "method2"를 호출하고 실패했다는 것을 알 수 있습니다.

귀하의 경우에는 이 콜스택이 있습니다(내 생각에는 "kb" 명령을 실행한 결과인 것 같습니다).

b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94
b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255
b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0
b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000

첫 번째 열은 하위 프레임 포인터를 나타내고, 두 번째 열은 실행 중인 메서드의 반환 주소를 나타내며, 다음 세 열은 메서드에 전달된 처음 3개의 매개 변수를 표시하고, 마지막 부분은 DLL 이름(nv4_disp)입니다. 실행 중인 메서드의 오프셋(+0x48b94)입니다.기호가 없으므로 메소드 이름을 볼 수 없습니다.NVIDIA가 해당 기호에 대한 공개 액세스를 제공하는지 의심스럽기 때문에 여기에서 많은 정보를 얻을 수 없을 것 같습니다.

"kpn 200"을 실행하는 것이 좋습니다.그러면 전체 콜스택이 표시되고 이 충돌을 일으킨 메서드의 출처를 확인할 수 있습니다. Microsoft DLL인 경우 제가 제공한 단계에 적절한 기호가 있어야 합니다.

최소한 NVIDIA 버그와 관련이 있다는 것은 알고 계실 것입니다. ;-) 이 드라이버의 DLL을 최신 버전으로 업그레이드해 보십시오.

WinDBG 디버깅에 대해 더 자세히 알고 싶다면 다음 링크를 추천합니다.

다른 팁

스택 추적 해석에 대한 정말 좋은 튜토리얼은 다음에서 확인할 수 있습니다.

http://www.codeproject.com/KB/debug/cdbntsd2.aspx

그러나 이와 같은 튜토리얼이 있어도 적절한 기호를 사용하거나 로드하지 않고 스택 덤프를 해석하는 것은 매우 어렵거나 거의 불가능할 수 있습니다.

읽으려는 스택의 예를 포함하는 것이 도움이 될 수 있습니다.좋은 팁은 스택에 표시된 모든 모듈에 대해 올바른 디버그 기호가 있는지 확인하는 것입니다.여기에는 OS의 모듈에 대한 기호가 포함되며 Microsoft는 기호 서버를 공개적으로 제공했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top