Create TOC

2002년 3월 8일

Debugging/Note

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

high cpu issue

  1. PerfMon 등으로 범인 thead 찾을것.
  2. userdump 들 이용해서 덤프떠서 확인하던지, debugger를 붙여서 해당 쓰레드를 조사할 것.

memory leak issue

Q268343 Umdhtools.exe: How to Use Umdh.exe to Find Memory Leaks

  1. PerfMon 으로 진짜 memory leak 인지 확인한다.
  2. GFlags 옵션을 조정한다.
  3. 재부팅
  4. DH -p <pid> -b -g -f dumpA.txt
  5. DH -p <pid> -b -g -f dumpB.txt
  6. 위 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)