Programming/Debugging

[디버깅] λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μ κ²€ν•˜λŠ” 방법 - μž‘μ—… κ΄€λ¦¬μž

γ€€β€πŸ˜πŸ˜Š 2020. 4. 25. 22:48
λ°˜μ‘ν˜•

λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ™€ κ΄€λ ¨λœ ν¬μŠ€νŒ…μ€ μ•„λž˜ 링크λ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”.

[디버깅] λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ™€ μ κ²€ν•˜λŠ” 방법 μ†Œκ°œ

 

[디버깅] λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ™€ μ κ²€ν•˜λŠ” 방법 μ†Œκ°œ

μ†Œκ°œ Unmanaged Code인 C++은 λ©”λͺ¨λ¦¬ ν• λ‹Ήκ³Ό ν•΄μ œλ₯Ό κ°œλ°œμžκ°€ 직접 ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  ν•΄μ œλ₯Ό ν•˜μ§€ μ•ŠμœΌλ©΄, κ·ΈλŒ€λ‘œ λ©”λͺ¨λ¦¬κ°€ 점유되기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 그런데 λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” μ–΄λ–»κ²Œ μ κ²€ν• κΉŒμš”? 점..

luckygg.tistory.com

μ†Œκ°œ

μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ˜ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό κ°„λ‹¨ν•˜κ²Œ ν™•μΈν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ μœˆλ„μš°μ—μ„œ μ œκ³΅ν•˜λŠ” μž‘μ—… κ΄€λ¦¬μž(Task manager)μž…λ‹ˆλ‹€. 보톡 μž‘μ—… κ΄€λ¦¬μžλŠ” μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ΄ 먹톡이 λ˜μ—ˆμ„ λ•Œ μ’…λ£Œν•˜κΈ° μœ„ν•΄ 많이 μ‚¬μš©ν–ˆμ„ 거라 μƒκ°λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 점검 μš©μœΌλ‘œλ„ μ‚¬μš©λ  수 μžˆλŠ” 점을 이번 ν¬μŠ€νŒ…μ„ 톡해 μ†Œκ°œν•˜κ² μŠ΅λ‹ˆλ‹€.

μž‘μ—… κ΄€λ¦¬μžμ˜ λ©”λͺ¨λ¦¬ μ˜΅μ…˜

μž‘μ—… κ΄€λ¦¬μžμ—μ„œ λ©”λͺ¨λ¦¬ μ‚¬μš© κ΄€λ ¨ μ˜΅μ…˜μ„ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€. μš°μ„  μž‘μ—… κ΄€λ¦¬μžλ₯Ό μ‹€ν–‰ν•˜κ³ , μ„ΈλΆ€ 정보 메뉴λ₯Ό ν΄λ¦­ν•©λ‹ˆλ‹€.

μž‘μ—… κ΄€λ¦¬μž

그리고 리슀트 뷰의 헀더 뢀뢄에 마우슀 우 클릭 ν›„ μ—΄ 선택을 ν΄λ¦­ν•©λ‹ˆλ‹€. 였λ₯Έμͺ½ μ°½κ³Ό 같이 μ—΄ 선택 μ˜΅μ…˜μ΄ ν‘œμ‹œλ©λ‹ˆλ‹€.

μ—΄ 선택 μ˜΅μ…˜

κ°„λ‹¨νžˆ λͺ‡ 가지 μ˜΅μ…˜μ„ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ˜΅μ…˜ μ„€λͺ…
μž‘μ—… 집합(λ©”λͺ¨λ¦¬) 개인 μž‘μ—… μ§‘ν•©μ˜ λ©”λͺ¨λ¦¬ μ–‘κ³Ό ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‚¬μš© 쀑이며 κ³΅μœ ν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬ 양을 λ”ν•œ 값을 μ˜λ―Έν•©λ‹ˆλ‹€. 즉, 전체 μ‚¬μš© 쀑인 λ©”λͺ¨λ¦¬ 양을 μ˜λ―Έν•©λ‹ˆλ‹€.
졜고 μž‘μ—… 집합(λ©”λͺ¨λ¦¬) μ‚¬μš©ν•˜λŠ” μž‘μ—… 집합 쀑 μ΅œλŒ€ 치λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.
μž‘μ—… 집합 델타(λ©”λͺ¨λ¦¬) μž‘μ—… 집합 λ©”λͺ¨λ¦¬μ˜ λ³€ν™”λŸ‰μ„ ν‘œμ‹œν•©λ‹ˆλ‹€.
λ©”λͺ¨λ¦¬(개인 μž‘μ—… 집합) λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ κ³΅μœ ν•  수 μ—†λŠ” λ©”λͺ¨λ¦¬ 양을 ν‘œμ‹œν•©λ‹ˆλ‹€.

μ‹€μŠ΅

μ§€κΈˆκΉŒμ§€, μž‘μ—… κ΄€λ¦¬μžμ—μ„œ λ©”λͺ¨λ¦¬μ˜ 양을 점검할 수 μžˆλŠ” μ˜΅μ…˜μ„ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 이제 μ‹€μŠ΅μ„ 톡해 μ‹€μ œ μ–΄λ–»κ²Œ ν‘œμ‹œλ˜λŠ”μ§€ 확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€. 예제λ₯Ό μœ„ν•΄ MFC Dialog ν”„λ‘œμ νŠΈ 생성 ν›„ λ²„νŠΌ 두 개λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

MFC Dialog μ˜ˆμ‹œ

xxxDlg Class에 멀버 λ³€μˆ˜λ‘œ std::vector<byte*> m_vBuffersλ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€.

#include <vector>

class CMFCApplication1Dlg : public CDialogEx
{
	// ...
	std::vector<byte*> m_vBuffers;
    // ...
}

Alloc λ²„νŠΌμ—λŠ” μ•„λž˜μ™€ 같이 κ΅¬ν˜„ν•©λ‹ˆλ‹€. λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ 1MByteκ°€ ν• λ‹Ήλ©λ‹ˆλ‹€.

void CMFCApplication1Dlg::OnBnClickedButtonAlloc()
{
	m_vBuffers.push_back(new byte[1024 * 1024]);
}

Free λ²„νŠΌμ—λŠ” μ•„λž˜μ™€ 같이 κ΅¬ν˜„ν•©λ‹ˆλ‹€.

void CMFCApplication1Dlg::OnBnClickedButtonFree()
{
	if (m_vBuffers.size() == 0)
		return;

	std::vector<byte*>::iterator it = m_vBuffers.begin();
	
	delete[] *it;
	*it = nullptr;
	
	m_vBuffers.erase(it);
}

이제 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κ³  μž‘μ—… κ΄€λ¦¬μžμ—μ„œ λ©”λͺ¨λ¦¬ 양을 ν™•μΈν•˜κ² μŠ΅λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ ν›„ μž‘μ—… 집합은 15,460KBμ˜€μŠ΅λ‹ˆλ‹€. Alloc λ²„νŠΌ 클릭 ν›„ 1,040KBκ°€ μ¦κ°€ν–ˆμœΌλ©°, μž‘μ—… 집합 및 졜고 μž‘μ—… 집합 λ©”λͺ¨λ¦¬ 양은 16,440KBκ°€ λμŠ΅λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ μ¦κ°€λŸ‰ 비ꡐ

μ΄λ²ˆμ—” λ°˜λŒ€λ‘œ Free λ²„νŠΌμ„ 클릭해 λ³΄κ² μŠ΅λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ ν•΄μ œλ‘œ 1,024KBκ°€ κ°μ†Œν–ˆκ³ , μž‘μ—… 집합은 15,320KBκ°€ λμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 졜고 μž‘μ—… 집합은 μ—¬μ „νžˆ 16,440KBλ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ κ°μ†ŒλŸ‰ 비ꡐ

주의
 
 

λ©”λͺ¨λ¦¬ 생성과 ν•΄μ œ ν›„ μž‘μ—… 집합 및 λ©”λͺ¨λ¦¬ ν‘œμ‹œλŸ‰μ΄ μ •ν™•ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. 이전 ν¬μŠ€νŒ…μ—μ„œ ν™•μΈν•œ κ²°κ³Ό, ν•¨μˆ˜ 호좜 μ‹œ μ‚¬μš©μžμ˜ 동적 ν• λ‹Ή 외에도 Windows API λ‚΄μ—μ„œ λ©”λͺ¨λ¦¬ μƒμ„±μœΌλ‘œ μ˜€μ°¨κ°€ μƒκΈ°λŠ” 것을 μ•Œκ²Œ λμŠ΅λ‹ˆλ‹€.

[디버깅] λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μ κ²€ν•˜λŠ” 방법 - μ„±λŠ₯ ν”„λ‘œνŒŒμΌλŸ¬

κ²°λ‘ 

μž‘μ—… κ΄€λ¦¬μžμ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ ν‘œμ‹œ μ˜΅μ…˜ 쀑 μž‘μ—… 집합과 졜고 μž‘μ—… 집합을 λͺ¨λ‹ˆν„°λ§ν•˜μ—¬, λ©”λͺ¨λ¦¬μ˜ ν˜„μž¬ μ‚¬μš©λŸ‰κ³Ό 졜고 μ‚¬μš©λŸ‰ 점검이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ³„λ„μ˜ λͺ¨λ‹ˆν„°λ§ ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•˜μ—¬, μΌμ •ν•œ 주기둜 νŠΉμ • ν”„λ‘œμ„ΈμŠ€μ˜ μž‘μ—… 집합과 졜고 μž‘μ—… 집합을 κΈ°λ‘ν•œλ‹€λ©΄, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μΌμ •ν•œμ§€ λ˜λŠ” μ„œμ„œνžˆ μ¦κ°€ν•˜λŠ”μ§€ μ•Œ 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

λ°˜μ‘ν˜•