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