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.0192 sec