[๋๋ฒ๊น ] ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ๊ฒํ๋ ๋ฐฉ๋ฒ - CRTDBG (์์ ํฌํจ)
๋ฉ๋ชจ๋ฆฌ ๋์์ ๊ด๋ จ๋ ํฌ์คํ ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
[๋๋ฒ๊น ] ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ ๊ฒํ๋ ๋ฐฉ๋ฒ ์๊ฐ
MFC Dialog ์์
MFC Dialog ํ๋ก์ ํธ ์์ ๋ฅผ ํตํด ๊ณ ์๋ก ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐ์์์ผ ๋ณด๊ฒ ์ต๋๋ค. Main Dialog์ ๋ค์๊ณผ ๊ฐ์ด ๋ฉค๋ฒ ๋ณ์๋ก byte
ํ ํฌ์ธํฐ๋ฅผ ์ ์ธํฉ๋๋ค.
byte* m_pBuffer;
๊ทธ๋ฆฌ๊ณ ๋ฒํผ์ ์ถ๊ฐํ๊ณ , ๋ฒํผ ํด๋ฆญ ์ ๋ค์๊ณผ ๊ฐ์ด 100byte๋ฅผ ๋์ ํ ๋น ํ๋๋ก ์ฝ๋๋ฅผ ์์ ํฉ๋๋ค.
void CMFCApplication1Dlg::OnBnClickedButton1()
{
m_pBuffer = new byte[100];
}
F5๋ก ๋๋ฒ๊ทธ ๋ชจ๋๋ก ์คํ ํ ๋ฒํผ์ ํด๋ฆญํ๊ณ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ฉด, ์ถ๋ ฅ ์ฐฝ์ ๋ค์๊ณผ ๊ฐ์ด Memory Leak ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
์ด ์ถ๋ ฅ ์ฐฝ์์ F4
๋๋ ๋ฉ์์ง๋ฅผ ๋๋ธ ํด๋ฆญ
ํ๋ฉด, ์์ค ์ฝ๋์ ์ด๋ ๋ถ๋ถ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋์ง ํ์ํด์ค๋๋ค.
๊ทธ๋ผ, ์ถ๋ ฅ ์ฐฝ์ ํ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฉ์์ง๋ฅผ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค. Detected memory leaks!
๋ฉ์์ง ์ดํ์ xxx.cpp(161)
์ ํด๋น ๊ฒฝ๋ก์ ์์ค ํ์ผ์ 161 ๋ผ์ธ์์ ๋์๊ฐ ๋ฐ์ํ๋ค๋ ์๋ฏธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ {579}
๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์๋ฅผ ์๋ฏธํ๋ฉฐ, 579๋ฒ์งธ ํ ๋น๋ ๋ถ๋ถ์ ๋์๊ฐ ๋ฐ๊ฒฌ๋๋ค๋ ๋ป์
๋๋ค. 0x01602760
๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ด๊ณ , 100 bytes long
์ ๋์๋ ํฌ๊ธฐ์
๋๋ค.
์ด๋ ๊ฒ MFC ํ๋ก์ ํธ์์๋ ์น์ ํ๊ฒ ์์ค ์ฝ๋ ํ์ผ๊ณผ ๋ผ์ธ๊น์ง ์ถ๋ ฅ๋์ด ํธํ๊ฒ ๋๋ฒ๊น
์ด ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ ์ด์ ๋ xxxDlg.cpp
์ ์๋จ์ ์๋์ฒ๋ผ ์ ์๊ฐ ๋์ด์๊ธฐ ๋๋ฌธ์
๋๋ค.
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
์ ์ฝ๋์ ์๋ฏธ๋, Debug ๋ชจ๋๋ผ๋ฉด new
๋ฅผ DEBUG_NEW
๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ์
๋๋ค. DEBUG_NEW
๋ afx.h
์ ์๋์ฒ๋ผ ์ ์๋์ด ์์ต๋๋ค.
#define THIS_FILE __FILE__
//...
#define DEBUG_NEW new(THIS_FILE, __LINE__)
C++ Console ์์
์ด๋ฒ์๋ C++ Console ํ๋ก์ ํธ์์ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ํ
์คํธ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค. main()
์ ๋ค์์ฒ๋ผ 100byte๋ฅผ ๋์ ํ ๋นํฉ๋๋ค.
int main()
{
byte* buff = new byte[100];
return 0;
}
๊ทธ๋ฆฌ๊ณ ์คํ ํ ์ข ๋ฃํ๋ฉด ์ถ๋ ฅ ์ฐฝ์ ๋ณ๋ค๋ฅธ ๋ฉ์์ง๊ฐ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๋๊ฒ ๊ฐ์ฃ ?
๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๋์ง ์ ๊ฒํ๊ธฐ ์ํด ์๋์ฒ๋ผ ์ฝ๋๋ฅผ ์์ ํฉ๋๋ค.
#include "pch.h"
#include <iostream>
#include <Windows.h>
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
int main()
{
byte* buff = new byte[100];
_CrtDumpMemoryLeaks();
return 0;
}
๊ทธ๋ฆฌ๊ณ ์คํ ํ ์ข
๋ฃํ๋ฉด ๋ฉ์์ง ์ฐฝ์ Detected memory leaks!
๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
MFC์๋ ๋ค๋ฅด๊ฒ ์์ค ํ์ผ๊ณผ ๋ผ์ธ ์๊ฐ ํ์๋์ง ์๋ ์ฐจ์ด์ ์ด ์์ต๋๋ค. ์ด๋ฒ์๋ ์๋์ฒ๋ผ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ฌ ํ ์คํธํด ๋ณด๊ฒ ์ต๋๋ค.
#include "pch.h"
#include <iostream>
#include <Windows.h>
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#ifdef _DEBUG
#define new new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#endif
int main()
{
byte* buff = new byte[100];
_CrtDumpMemoryLeaks();
return 0;
}
๋ณ๊ฒฝ๋ ์์ค ์ฝ๋ ์คํ ํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด์ ์์ค ํ์ผ๊ณผ ๋ผ์ธ ์๊ฐ ํ์๋๊ณ , F4
๋๋ ๋๋ธ ํด๋ฆญ
์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋์ ์ง์ ํ์ธ์ด ๊ฐ๋ฅํด์ง๋๋ค. MFC์ ๋ง์ฐฌ๊ฐ์ง๋ก, new
๋ฅผ new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
๋ก ์นํํ์ฌ ์ธ๋ถ ๋ด์ฉ ์ถ๋ ฅ์ด ๊ฐ๋ฅํ ๊ฒ์
๋๋ค.
์ฌ๊ธฐ์ ํ ๊ฐ์ง ๋ ์๋ ค๋๋ฆด ๋ด์ฉ์ด ์์ต๋๋ค. ์ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฉ์์ง์ {86}
์ด ์๋๋ฐ์. ์ด๋ 86๋ฒ์งธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์์ ๋ฌธ์ ๊ฐ ์๋ค๋ ์๋ฏธ์
๋๋ค. main()
์ฒซ ๋ถ๋ถ์ _CrtSetBreakAlloc(86)
์ ์ถ๊ฐํ๋ฉด, 86๋ฒ์งธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ง์ ์์ ์คํ์ด ์ค์ง๋ฉ๋๋ค.
#include "pch.h"
#include <iostream>
#include <Windows.h>
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#ifdef _DEBUG
#define new new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#endif
int main()
{
_CrtSetBreakAlloc(86);
byte* buff = new byte[100];
_CrtDumpMemoryLeaks();
return 0;
}
ํธ์ถ ์คํ(Call Stack)
์ ์ฌ์ฉํ์ฌ ํธ์ถ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ธ ๋ฒ์งธ์ Exam_MemoryLeak.exe!main() ์ค 22
๊ฐ ๋ณด์
๋๋ค. ๋๋ธ ํด๋ฆญํ๋ฉด ์๋์ ํ๋ฉด์ด ํ์๋ฉ๋๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์กฐ๊ธ ์ ๋งคํฉ๋๋ค. MFC์์ ๋์ผํ๊ฒ ํ ์คํธํ ๊ฒฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์๊ฐ ์คํ ๋๋ง๋ค ๋ฐ๋์ด ์ ์ฉ์ด ์ ๋ฉ๋๋ค. ํ์ง๋ง C++ Console์ ํญ์ ์ผ์ ํ๋๊ตฐ์. ์ด ๋ถ๋ถ์ ์์ง ์๋ฌธ์ด์ง๋ง, ๊ตณ์ด ํ์ํ์ง ์์ ๊ฒ ๊ฐ๋ค์.
๋ง์ง๋ง์ผ๋ก, ํ๋ก๊ทธ๋จ ์ข
๋ฃ ๋ถ๋ถ์ _CrtDumpMemoryLeaks()
๋ฅผ ๋ฃ๋ ๊ฒ ๋์ , ์ฒซ ๋ถ๋ถ์ _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF)
๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
#include "pch.h"
#include <iostream>
#include <Windows.h>
#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>
#ifdef _DEBUG
#define new new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#endif
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
byte* buff = new byte[100];
//_CrtDumpMemoryLeaks();
return 0;
}
๋ง์ฐฌ๊ฐ์ง๋ก, ๋ฉ์์ง ์ถ๋ ฅ ์ฐฝ์ ์์ค ํ์ผ๊ณผ ๋ผ์ธ ์๊ฐ ํ์๋์ด ๋ฉ๋ชจ๋ฆฌ ๋์ ์ง์ ์ ์ฐพ์ ์ ์์ต๋๋ค. ์ฆ, ์ง๊ธ๊น์ง ์ค๋ช ํ ๊ฒ์ ํ ๋๋ก, ์ต์ข ์ ์ผ๋ก ์ ์์ ์ฝ๋๋ฅผ ์ ์ฉํ๋ฉด ๋๊ฒ ์ต๋๋ค.
'Programming > Debugging' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[๋๋ฒ๊น ] ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ๊ฒํ๋ ๋ฐฉ๋ฒ - ์์ ๊ด๋ฆฌ์
[๋๋ฒ๊น ] ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ๊ฒํ๋ ๋ฐฉ๋ฒ - ์์ ๊ด๋ฆฌ์
2020.04.25 -
[๋๋ฒ๊น ] ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ๊ฒํ๋ ๋ฐฉ๋ฒ - ์ฑ๋ฅ ํ๋กํ์ผ๋ฌ
[๋๋ฒ๊น ] ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ๊ฒํ๋ ๋ฐฉ๋ฒ - ์ฑ๋ฅ ํ๋กํ์ผ๋ฌ
2020.04.17 -
[๋๋ฒ๊น ] ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ๊ฒํ๋ ๋ฐฉ๋ฒ - CRTDBG Snapshot(์์ ํฌํจ)
[๋๋ฒ๊น ] ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ๊ฒํ๋ ๋ฐฉ๋ฒ - CRTDBG Snapshot(์์ ํฌํจ)
2020.04.14 -
[๋๋ฒ๊น ] ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ ๊ฒํ๋ ๋ฐฉ๋ฒ ์๊ฐ
[๋๋ฒ๊น ] ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ ๊ฒํ๋ ๋ฐฉ๋ฒ ์๊ฐ
2020.04.11