'); }
'); }
Thread관련프로그램에서 ntdll.dll에서 죽는 경우가 생겨 Debugging을 하다가 알게된 Debugging Tip
이 있어 소개합니다.
프로그램 중 Windows의 c:/windows/system32/ntdll.dll에서 프로그램이 죽은 case가 있었습니다.
물론 ntdll.dll에 문제가 아니라 우리가 작성한 program의 문제이겠지만,
ntdll.dll의 어떤 부분에서 죽었다는 정도의 힌트가 있다면 도움이 될 것입니다.
이런 symbol을 표시할 수 있도록 하는 Tip입니다.
일단 프로그램을 실행시키면 output window에 아래와 같은 Load정보가 나옵니다.
'Program.exe': Loaded 'D:\project\program\Debug\program.exe', Symbols loaded.
'Program.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll'
'Program.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll'
'Program.exe': Loaded 'C:\WINDOWS\system32\setupapi.dll'
'Program.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll'
이중 내 프로그램이라면 Symbols loaded라고 나옵니다.
이런 symbol정보는 컴파일 후 생성된 파일인 pdb파일에서 가져오는 것입니다.
그런데 Windows가 가지고 있는 dll들이 load될 때는 이런 pdb파일이 없기 때문에 symbol정보를 load할 수 없습니다.
결국 내가 작성해서 컴파일한 파일에서만 symbol정보를 이용할 수 있게 됩니다.
이렇게 OS의 symbol이 없는 상태에서 오류가 났을 경우의 예를 보겠습니다.
* call stack tree :
ntdll.dll!7c942b9f()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7c942b9f()
kernel32.dll!7c802440()
kernel32.dll!7c802402()
kernel32.dll!7c802455()
program.exe!CPortManager::SendThreadProc(void * pThis=0x01159dd8) Line 287 + 0xa bytes C++
kernel32.dll!7c80b713()
program.exe!_unlock(int locknum=11962888) Line 376 C
ntdll.dll에서 오류가 났다는 것은 알겠는데 좀 더 자세한 정보는 symbol이 load되지 않아 알 수 없다고 나옵니다.
이 있어 소개합니다.
프로그램 중 Windows의 c:/windows/system32/ntdll.dll에서 프로그램이 죽은 case가 있었습니다.
물론 ntdll.dll에 문제가 아니라 우리가 작성한 program의 문제이겠지만,
ntdll.dll의 어떤 부분에서 죽었다는 정도의 힌트가 있다면 도움이 될 것입니다.
이런 symbol을 표시할 수 있도록 하는 Tip입니다.
일단 프로그램을 실행시키면 output window에 아래와 같은 Load정보가 나옵니다.
'Program.exe': Loaded 'D:\project\program\Debug\program.exe', Symbols loaded.
'Program.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll'
'Program.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll'
'Program.exe': Loaded 'C:\WINDOWS\system32\setupapi.dll'
'Program.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll'
이중 내 프로그램이라면 Symbols loaded라고 나옵니다.
이런 symbol정보는 컴파일 후 생성된 파일인 pdb파일에서 가져오는 것입니다.
그런데 Windows가 가지고 있는 dll들이 load될 때는 이런 pdb파일이 없기 때문에 symbol정보를 load할 수 없습니다.
결국 내가 작성해서 컴파일한 파일에서만 symbol정보를 이용할 수 있게 됩니다.
이렇게 OS의 symbol이 없는 상태에서 오류가 났을 경우의 예를 보겠습니다.
* call stack tree :
ntdll.dll!7c942b9f()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7c942b9f()
kernel32.dll!7c802440()
kernel32.dll!7c802402()
kernel32.dll!7c802455()
program.exe!CPortManager::SendThreadProc(void * pThis=0x01159dd8) Line 287 + 0xa bytes C++
kernel32.dll!7c80b713()
program.exe!_unlock(int locknum=11962888) Line 376 C
ntdll.dll에서 오류가 났다는 것은 알겠는데 좀 더 자세한 정보는 symbol이 load되지 않아 알 수 없다고 나옵니다.
MS에서는 이런 Kernel, System등에 사용하는 dll들의 pdb를 Symbol server에서 제공하고 있습니다.
이제 symbol Server를 사용하여 Symbol load하도록 하겠습니다.
1. VS2008 > tools > option > debugging > symbols 로 갑니다.
2. symbol file(.pdb) location에 http://msdl.microsoft.com/download/symbols를 추가해줍니다.
3. Cache symbols from ..... 에 내가 원하는 폴더를 만들어서 setting합니다.
저는 C:\Program Files\Microsoft Visual Studio 9.0\symbols 으로 setting했습니다.
이제 다 되었습니다.
프로그램을 실행시키면 output window에 아래와 같이 symbol이 load되는 것을 볼 수 있습니다.
(처음 load시에는 웹에서 download받아야 하기 때문에 엄청나게 느릴 수 있습니다.
하지만 cache folder에 저장되기 때문에 다음번 부터는 속도에 큰 지장을 주지는 않습니다.)
'Program.exe': Loaded 'D:\project\LGNPST\Program\Debug\Program.exe', Symbols loaded.
'Program.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Symbols loaded (source information stripped).
'Program.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Symbols loaded (source information stripped).
'Program.exe': Loaded 'C:\WINDOWS\system32\setupapi.dll', Symbols loaded (source information stripped).
'Program.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', Symbols loaded (source information stripped).
'Program.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll', Symbols loaded (source information stripped).
이제 오류가 날 때에도 call stack에 자세한 symbol 정보가 나오게 됩니다.
ntdll.dll!_RtlDeactivateActivationContextUnsafeFast@4() + 0x419c2 bytes
kernel32.dll!_SleepEx@8() + 0xa0 bytes
kernel32.dll!_SleepEx@8() + 0x62 bytes
kernel32.dll!_Sleep@4() + 0xf bytes
Program.exe!CPortManager::SendThreadProc(void * pThis=0x01159e18) Line 284 + 0xa bytes C++
kernel32.dll!_BaseThreadStart@8() + 0x37 bytes
'Tech & IT > 프로그래밍' 카테고리의 다른 글
COM/ATL 관련 tip (0) | 2009.04.27 |
---|---|
COM Versioning관련해서 알아볼 것 (0) | 2009.02.18 |
Debugging Tools and Symbols: Getting Started (0) | 2009.02.17 |
[MSDN] Serial Communications in Win32 (0) | 2009.02.16 |
64비트 윈도우를 프로그래밍 하기 위해서 알아야 할 모든 것들 (0) | 2009.02.10 |