U E D R , A S I H C RSS

Debugging Seminar_2005/DebugCRT

DCRT

Debug C Runtime ด๋ž˜Šค๋ฅผ ดšฉ•˜๋ฉด ๋ผด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ •Œ•„„œ ๋™ • ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ —ญถ” •˜—ฌ ๋ˆ„ˆ˜๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋Š •˜๋Š” ๊ฒƒด ๊ฐ€๋Šฅ•˜๋‹ค.
ž๊ธฐ๊ฐ€ ง  ”„๋กœ๊ทธ๋žจœผ๋กœ ๋Œ๋ ค๋ณด๊ณ  ๋ˆ„ˆ˜ —ฌ๋ถ€๋ฅผ Œ๋‹จ•˜๊ธฐ— ข‹„ ๊ฒƒด๋‹ค.

~cpp _crtDbgFlag

_CRTDBG_ALLOC_MEM_DF ๋””๋ฒ„๊ทธ • ๋‹น ™œ„™”. free store ƒƒœ ถ” 
_CRTDBG_DELAY_FREE_MEM_DF ๋ฉ”๋ชจ๋ฆฌ๋ฅผ delete— ˜•ด •ดง€ ๋˜ง€ •Š๋„๋ก•จ. ๋ฉ”๋ชจ๋ฆฌ ๋ถ€ƒ™ฉ•˜— ๋ฐœƒ•˜๋Š” ผ„ •Œ ˆ˜ ž‡Œ
_CRTDBG_CHECK_ALWAYS_DF _CrtCheckMemory() •จˆ˜๋ฅผ ๋ชจ๋“  new, delete •จˆ˜— ๋Œ€•ด„œ ž๋™ ˜ธถœ ๋˜๋„๋ก ง€ ••œ๋‹ค.
ด •จˆ˜๋Š” • ๋‹น๋œ ๊ณต๊ฐ„˜ œ šจ„„ ง€† œผ๋กœ ฒดฌ•œ๋‹ค. ฆ‰ domainerror๋‚˜ ๊ธฐƒ€ ๋ฉ”๋ชจ๋ฆฌ access— ๊ด€•œ ๋ถ€๋ถ„„ ๊ฒ€‚ฌ•œ๋‹ค. ๋Œ€‹  ˜ค๋ฒ„—ค๋“œ๊ฐ€ ƒ๋‹น•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋งŒผ ๋””๋ฒ„๊น…˜ šจœจ„„ ๋†’—ฌ„ ˆ˜ žˆ๋‹ค.
_CRTDBG_CHECK_CRT_DF ๋‚ด๋ถ€ œผ๋กœ ‚ฌšฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋””๋ฒ„๊ทธž‘—…„ •˜๋Š” ๋™•ˆ ถ” ๋œ๋‹ค.
_CRTDBG_LEAK_CHECK_DF ”„๋กœ๊ทธ๋žจด ข…๋ฃŒ๋˜๋Š” ‹œ —„œ _CrtDumpMemoryLeaks()๋ฅผ ˜ธถœ. ๋ฉ”๋ชจ๋ฆฌ •ด œ— ‹คŒจ•œ ๊ฒฝšฐ ๊ทธ  •๋ณด๋ฅผ –ป„ ˆ˜ žˆ๋‹ค.
_CRTDBG_ALLOC_MEM_DF ๋Š” ๊ธฐ๋ณธ œผ๋กœ on, ๊ธฐƒ€ ”Œ๋ž˜๊ทธ๋Š” ๋””ดŠธ offด๋ฏ€๋กœ bitwise —ฐ‚ฐž๋ฅผ ดšฉ•ด„œ   ˆ•˜๊ฒŒ ”Œ๋ž˜๊ทธ๋ฅผ „ ••ด•ผ•œ๋‹ค.

~cpp 
int flas = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
flag |= _CRTDBG_LEAK_CHECK_DF;  // ”Œ๋ž˜๊ทธ on
flag &= !_CRTDBG_LEAK_CHECK_DF;  // ”Œ๋ž˜๊ทธ off
_CrtSetDbgFlag(flag);

Code

~cpp 
//this define must occur before any headers are included.
//๋ฐ˜๋“œ‹œ include  „ฒ˜๋ฆฌ๊ธฐ˜ •ž๋ถ€๋ถ„— „ –ธ๋˜–ด•ผ•จ.
#define _CRTDBG_MAP_ALLOC

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

// include crtdbg.h after all other headers.
//  „ฒ˜๋ฆฌ ๋ฌธžฅด ๋๋‚œ๋’ค— include
#include <crtdbg.h>

int main(int argc, char *argv[]) {
	//turn on the full heap checking
	//DCRT˜ ˜ค๋ฒ„—ค๋“œ๊ฐ€ ƒ๋‹น•˜๊ธฐ ๋•Œ๋ฌธ— ๊ธฐ๋ณธ˜ต…˜ด ๊บผ ธžˆ๋‹ค๊ณ  •œ๋‹ค. ๋”ฐ๋ผ„œ ๋‹คŒ๊ณผ ๊ฐ™ด ˜ต…˜„ ™œ„™” •˜๋Š” ž‘—…ด •„š”
	_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF	|
					_CRTDBG_CHECK_ALWAYS_DF	|
					_CRTDBG_DELAY_FREE_MEM_DF	|
					_CRTDBG_LEAK_CHECK_DF	);

	//Allocate some more memory.
	TCHAR* pNew = new TCHAR[200];
	TCHAR* pNew2 = new TCHAR[200];
	TCHAR* pMemLeak = (TCHAR*)malloc (100);

	_tcscpy( pNew, _T("New'd memory...") );
	_tcscpy( pNew2, _T("more New'd memory...") );
	_tcscpy( pMemLeak, _T("Malloc'd memory...") );

	return EXIT_SUCCESS;
}
MFC—„œ๋Š” ๊ธฐ๋ณธ œผ๋กœ ๋กœ๋“œ•˜ง€๋งŒ ฝ˜†”—„œ๋Š” ‚ฌšฉž๊ฐ€ ง ‘ ง€ •„ •ดค˜•ผ ๋กœ๋“œ•œ๋‹ค.

CRT ๊ธฐƒ€ •จˆ˜

CRT˜ ๊ธฐ๋ณธ •จˆ˜๋“ค˜ ถœ๋ ฅ€ ๋””๋ฒ„๊ทธ ๋ฉ”‹œง€ œˆ๋„šฐด๋‹ค. ด๋ฅผ ๋ณ€๊ฒฝ•˜๊ธฐœ„•ด„œ๋Š” _CrtSetReportMode()๋ผ๋Š” •จˆ˜๋ฅผ ดšฉ•ด„œ ถœ๋ ฅ—๋Œ€•œ ผ๋ฐ˜ ๋ชฉ ง€๋ฅผ ง€ ••˜๊ณ , _CrtSetReportFile()๋ฅผ ดšฉ•ด„œ Šน๋ณ„•œ ŠคŠธ๋ฆผ ๋ชฉ ง€๋ฅผ „ ••ด•ผ•œ๋‹ค.
~cpp int _CrtSetReportMode(int reportType, int reportMode);

reportType
_CRT_WARN ๊ฒฝ๊ณ  ๋ฉ”‹œง€ ˜ˆ)memory leak
_CRT_ERROR ๋ณต๊ตฌ๋ถˆ๊ฐ€•œ น˜๋ช…  —๋Ÿฌ
_CRT_ASSERT assertion ถœ๋ ฅ(assert() ถœ๋ ฅด •„๋‹ˆ๋‹ค)
crtdbg.h๋Š” ASSERT, ASSERTE๋ผ๋Š” ๋ฉ”ฌ๋กœ •จˆ˜๋ฅผ ƒ„•œ๋‹ค. ๋‘˜˜ ฐจด € ASSERTE๋Š” assertion ‘œ˜„„ ๋ณด๊ณ •˜๊ณ , ๋‹ค๋ฅธ ๊ฒƒ€ •˜ง€ •Š๋Š” ๋‹ค๋Š” ๊ฒƒด๋‹ค.

reportMode
_CRTDBG_MODE_DEBUG ๋””๋ฒ„๊ทธ œˆ๋„šฐ •ˆ—„œ ๋ณด๊ฒŒ๋  ๋””๋ฒ„๊ทธ ๋ฌธž—ด— ถœ๋ ฅ„  „๋‹ฌ
_CRTDBG_MODE_FILE output stream
_CRTDBG_MODE_WNDW ๋ฉ”‹œง€ ๋ฐ•Šค
_CRTDBG_REPORT_MODE ˜„žฌ˜ ๋ฆฌฌŠธ ๋ชจ๋“œ๋ฅผ ๋ฆฌ„•œ๋‹ค.
๋‹คค‘ ๋ชฉ ง€ ง€ •€ flag „ •๊ณผ ๋งˆฐฌ๊ฐ€ง€๋กœ | —ฐ‚ฐž๋ฅผ †ต•ด„œ ๊ฐ€๋Šฅ•˜๋‹ค.


~cpp _HFILE _CrtSetReportFile(int reportType, _HFILE reportFile);
๋‘๋ฒˆงธ ธˆ˜๋Š” ŒŒผ ŠคŠธ๋ฆผ˜ _HFILE ˜•‹˜ ฌธ„ด๊ฐ๋‚˜ ๋‹คŒ˜ ‹๋ณ„ž๋“ค ค‘˜ •˜๋‚˜ด๋‹ค.
_CRTDBG_FILE_STDERR ‘œค€ —๋Ÿฌ ŠคŠธ๋ฆผœผ๋กœ  „๋‹ฌ
_CRTDBG_FILE_STDOUT ‘œค€ ถœ๋ ฅ ŠคŠธ๋ฆผœผ๋กœ  „๋‹ฌ
_CRTDBG_REPORT_FILE ˜„žฌ˜ ๋ชฉ ง€๋ฅผ ๋ฆฌ„•œ๋‹ค.

output in debug console (vc++6)

dcrt_output_debug_console.jpg

after

๋Œ€ฒด๋กœ ด๋ž˜Šค—„œ˜ ๋ฉ”๋ชจ๋ฆฌ œ ถœ€ ๋™  ๋ฉค๋ฒ„ ๋ณ€ˆ˜๋“คด ๋งŒ๋“ค–ดกŒ„ ๋•Œ •ด•ผ•˜๋Š” '‚ผ˜ ๋ฒ•น™'„ ง€‚คง€ •Š๋Š”๋ฐ„œ ๋น„๋กฏ๋˜๋Š” ๊ฒฝšฐ๊ฐ€ ๋งŽ๋‹ค.
๋™  ๋ฉค๋ฒ„๋ณ€ˆ˜๋ฅผ ‚ฌšฉ•˜๋Š” ๊ฒฝšฐ—๋Š” ๋Œ€ž…, • ๋‹น ƒ„ž, †Œ๋ฉธž๋ฅผ ๋ฐ˜๋“œ‹œ ๋งŒ๋“ค–ด•ผ•œ๋‹ค.
ฐธกฐ) The rule of Three

related

after

DCRT๋ฅผ ผœ๊ณ  ๋„๋Š” ๊ฒƒ— ๋”ฐ๋ผ„œ ”„๋กœ๊ทธ๋žจ˜ ˆ˜–‰†๋„˜ ฐจด๊ฐ€ ƒ๋‹น•˜๋‹ค. STL๋•Œ๋ฌธธง€๋„ ๋ชจ๋ฅด๊ฒ ง€๋งŒ. - eternalbleu

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:06
Processing time 0.0207 sec