Debugging?
- Debugger를 이용하여 문제를 해결하는 과정
- Debugging 분류
- Kernel mode debugging
- Drivers, File Systems, Operation System components
- 주로 BOD 발생
- SoftIce나 WinDbg 원격 디버깅 추천
- User Mode debugging
- Crash, Hang, Leak,...
- Debugging 방법
- Dump debugging - dump file 분석해서 원인 찾기.
- Interactive debugging - process 에 debugger 를 attach해서 실시간 디버깅.
보통 생각할 수 있는 문제 종류
- Crash - 대부분은 AV(Access Violation), 젤 잡기 쉬움
- Hang - CPU 100%, dead lock, I/O pending 등등
- Leak - memory, resource 등등
- 그외 논리 오류 등등
Debugging을 위해서 필요한것?
- Debugger
- symbol(보통 PDB)
- source code
위에서부터 순차적으로 중요함. 심볼만 있어도 무지 편함. Release build 시에도 debug symbol을 생성하게 해두는것이 중요!!! 하다못해 map 파일이라도 만들것. map 파일이라도 있으면 address 로 부터 함수명을 찾을 수 있음.
Microsoft Debugging Tools
- Microsoft Debugging Tools, WinDbg 등이 있음. me 용도 있기는 하지만 거의 NT 용이라고 생각하는게 좋음.
- UserDump download, download XP version, 메모리 덤프 뜰때
- Pageheap old version download download Finds Heap Corruption and Memory Errors How to Use Pageheap.exe in Windows XP
- Dr.Watson
- DumpChk - dump 파일이 정상적으로 생성되었는지 확인할때
- Umdh - memory leak 찾을때
high cpu issue
- PerfMon 등으로 범인 thead 찾을것.
- userdump 들 이용해서 덤프떠서 확인하던지, debugger를 붙여서 해당 쓰레드를 조사할 것.
memory leak issue
Q268343 Umdhtools.exe: How to Use Umdh.exe to Find Memory Leaks
- PerfMon 으로 진짜 memory leak 인지 확인한다.
- GFlags 옵션을 조정한다.
- 재부팅
- DH -p <pid> -b -g -f dumpA.txt
- DH -p <pid> -b -g -f dumpB.txt
- 위 4, 5 식으로 여러개 뜬 다음
dhcmp dumpA.txt dumpB.txt result.txt
이런식으로 각 메모리 덤프를 비교해서 어딘지 찾아본다.
그외
Link
Q196755 HOWTO: Determine the Location of a Crash
VC 6.0을 사용할 때 유용한 매크로
C-runtime library를 msvcrt로 하고 release 에서도 PDB 만들고 모든 빌드에서 map 파일 만들게 한다.
Sub ProjectSettingStandard()
'DESCRIPTION: 프로젝트 환경을 만든다.
Dim proj
Dim confs
Dim config
Dim release_map
Dim debug_map
Dim debug_name
Set proj = ActiveProject
Set confs = proj.Configurations
' map 파일 이름을 만든다.
release_map = "/map:" + Chr(34) + "Release/"+ proj.Name + ".map" + Chr(34)
debug_map = "/map:" + Chr(34) + "Debug/"+ proj.Name + ".map" + Chr(34)
' release, debug를 판단할 이름 생성.
debug_name = proj.Name + " - Win32 Debug"
' Application.Project.Configurations.Configuration.AddToolSettings "mfc", "2"
' None : 0(FOR SDK), MFC Static Libraries : 1, MFC Shared Dll : 2
If proj.Type = "Build" Then
For i = 1 To confs.Count
Set config = confs(i)
' Common Settings
' include path add
config.AddToolSettings "cl.exe", "/I " + Chr(34) + "../inc" + Chr(34)
' lib path add
config.AddToolSettings "link.exe", "/libpath:" + Chr(34) + "../lib" + Chr(34)
' remove compiler options
config.RemoveToolSettings "cl.exe", "/O2"
config.RemoveToolSettings "cl.exe", "/ZI"
' add compiler options
config.AddToolSettings "cl.exe", "/Od /Gm /Zi"
' add linker options
config.AddToolSettings "link.exe", "/debug /OPT:REF"
If config.Name = debug_name Then
' Debug 일때
config.AddToolSettings "cl.exe", "/MDd"
config.AddToolSettings "link.exe", debug_map
Else
' Release 일때
config.AddToolSettings "cl.exe", "/MD"
config.AddToolSettings "link.exe", release_map
End If
Next
End If
End Sub
알아두면 유용한 macro(C/C++)
- __FILE__ : 현재 파일(VC, GCC)
- __LINE__ : 현재 라인(VC, GCC)
- __FUNCTION__ : 현재 함수(VC 에서 되는지 잘 모름. GCC 에서는 문제 없음)
- NDEBUG : 릴리즈 빌드(VC, GCC)