SlideShare a Scribd company logo
Exception & Log
NHN NEXT
๋‚จํ˜„์šฑ
01
Exception
01 Exception
โ€ข	Structured Exception Handling(SEH)
ํ”„๋กœ๊ทธ๋žจ์„ ์•„๋ฌด๋ฆฌ ์ž˜ ๋งŒ๋“ค์–ด๋„ ์˜ˆ์™ธ ์ƒํ™ฉ(Exception)์€ ํ”ผํ•  ์ˆ˜ ์—†๋‹ค. ์˜ˆ์™ธ๋Š” ํ”„๋กœ๊ทธ๋žจ ์™ธ๋ถ€
์˜ ๋ถˆ๊ฐ€ํ•ญ๋ ฅ์ ์ธ ์ƒํ™ฉ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(์กด์žฌํ•ด์•ผ ํ•  ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š
๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋ฐ›์•„์•ผํ•˜๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜, ๊ธฐํƒ€ ๋“ฑ๋“ฑ). ์ด๋Ÿฐ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜
๊ธฐ ์œ„ํ•ด ์œˆ๋„์šฐ์ฆˆ์—์„œ๋Š” SEH๋ฅผ ์ด์šฉํ•œ๋‹ค. SEH๋ฅผ ์ด์šฉํ•˜๋ฉด ์‹คํ–‰ ์ฝ”๋“œ์™€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌ
์‹œ์ผœ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ, ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๊ตฌ์กฐ๋‚˜ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ C++ try
catch ๊ตฌ๋ฌธ๊ณผ ๊ฑฐ์˜ ๋˜‘๊ฐ™๋‹ค.
__try : ์‹คํ–‰ ์ฝ”๋“œ ๋ธ”๋Ÿญ
__except ( exception filter ) : ์˜ˆ์™ธ ์ƒํ™ฉ ๋ฐœ์ƒ์‹œ ์˜ˆ์™ธ์— ๋”ฐ๋ผ ์‹คํ–‰.
01 Exception
โ€ข	Exception Filter
SEH์—์„œ __except๋Š” ์ธ์ž๋กœ exception filter๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ด ํ•„ํ„ฐ๋Š” ์˜ˆ์™ธ๋ฅผ ๋ˆ„๊ฐ€ ์ฒ˜๋ฆฌํ• ์ง€, ์˜ˆ
์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ์— ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€ ๋“ฑ๋“ฑ์„ ์ง€์ •ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค. exception filter์—๋Š”
์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ๊ฐ’์€ excpt.h ํŒŒ์ผ์— ์ •์˜๋˜์–ด ์žˆ์Œ.
โ€ข	EXCEPTION_EXECUTE_HANDLER
โ€ข	EXCEPTION_CONTINUE_EXECUTION
โ€ข	EXCEPTION_CONTINUE_SEARCH
01 Exception
โ€ข	Exception Filter
EXCEPTION_EXECUTE_HANDLER
์ด ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ๋  ๊ฒฝ์šฐ, __try ๋ธ”๋ก์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ ์— ๊ทธ ์ดํ›„ __try ์ฝ”๋“œ ๋ธ”๋ก์˜ ์‹คํ–‰์„
๋ชจ๋‘ ์ƒ๋žตํ•˜๊ณ  global unwind๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ __except๋ธ”๋ก์˜ ์ฝ”๋“œ ๋ฐ ๊ทธ ์ดํ›„ ์ฝ”๋“œ๋“ค์„ ์ˆ˜ํ–‰ํ•˜
๊ฒŒ ๋œ๋‹ค.
int main()
{
	 int a = 0, b = 0;
	 __try
	{
		 b = 5 / a; //divide by 0
		printf("ignore.");
	}
	 __except(EXCEPTION_EXECUTE_HANDLER)
	{ printf("execption."); }
	 printf("after exception.");
}
//์‹คํ–‰์‹œ execption. after exception. ์ถœ๋ ฅ
01 Exception
โ€ข	Exception Filter
EXCEPTION_CONTINUE_EXECUTION
์ด ๊ฑด ์œ„ ํ•„ํ„ฐ์™€ ์ • ๋ฐ˜๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ด ํ•„ํ„ฐ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ __try ๋ธ”๋ก์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ
ํ–ˆ๋˜ ์ฝ”๋“œ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฆ‰ ์ด ํ•„ํ„ฐ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ๋ฐ˜๋ณต ์‹œํ–‰์—์„œ
๋ญ”๊ฐ€ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€
๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์›์ธ๋„ ๋ชจ๋ฅธ ์ฑ„ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ๊ฑฐ๋‚˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
int main()
{
	 int a = 0, b = 0;
	 //divide by 0
	 __try{ b = 5/a; }
	 __except(ExceptHandle(&a))
	{}
}
int ExceptHandle(int* divider)
{
	 scanf("%d",&divider);
	
	 return divider ?
	 EXCEPTION_EXECUTE_HANDLER :
	 EXCEPTION_CONTINUE_EXECUTION;
}
์‹คํ–‰์‹œ 0์œผ๋กœ ๋‚˜๋ˆˆ ๊ฒƒ์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒ -> 0 ์•„๋‹Œ
์ˆ˜ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต ์‹คํ–‰ -> 0 ์•„๋‹Œ ์ˆ˜ ๋‚˜์˜ค๋ฉด
__except ์•ˆ์˜ ์ฝ”๋“œ ์‹คํ–‰ ํ›„ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ์ง„ํ–‰.
01 Exception
โ€ข	Exception Filter
EXCEPTION_CONTINUE_SEARCH
์ด ํ•„ํ„ฐ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ํ˜„์žฌ ์ง€์ •๋œ __except์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ฝœ์Šคํƒ์„
๊ฑฐ๊พธ๋กœ ๋˜์ฐพ์•„๊ฐ€๋ฉด์„œ ๋‹ค๋ฅธ __except ๋ธ”๋ก์— ์ฒ˜๋ฆฌ๋ฅผ ๋„˜๊ธด๋‹ค(๊ฑฐ๊ธฐ์„œ๋„ EXCEPTION_CONTIN-
UE_SEARCH๋ผ๋ฉด ๋‹ค์‹œ ๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ๋จผ์ € ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์ชฝ์œผ๋กœ ์ญ‰ ์ง„ํ–‰). ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์•„๋ฌด๋Ÿฐ ํ•ธ๋“ค๋Ÿฌ
๋„ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์ข…๋ฃŒ๋œ๋‹ค.
void foo()
{
	 int a = 0, b = 0;
	 __try
	 { b = 5 / a; // divide by 0 }
	 __except
	(EXCEPTION_CONTINUE_SEARCH)
	{ printf("ignore."); }
}
int main()
{
	 __try
	{ foo(); }
	 __except
	(EXCEPTION_EXECUTE_HANDLER)
	{ printf("exception."); }
}
์‹คํ–‰์‹œ exception. ์ถœ๋ ฅ๋จ.
01 Exception
โ€ข	Unhandled Exception
์•ž์„  ํ•„ํ„ฐ๋“ค์„ ํ†ตํ•ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ SEH๋ฅผ ํ†ตํ•ด ์–ด๋–ค์‹์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€
์‚ดํŽด๋ณด์•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฐ ์˜ˆ์™ธ ์ค‘์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํŠน์ • ํ•ธ๋“ค๋Ÿฌ๋ฅผ
ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๊นŒ์ „์— EXCEPTION_CONTINUE_SEARCH ํ•„ํ„ฐ๋ฅผ
์„ค์ •ํ–ˆ์„ ๊ฒฝ์šฐ ๋๊นŒ์ง€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ๊ทธ๋ƒฅ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ์–ด๋ฒ„๋ฆฌ๋Š”๋ฐ, ์ด๋Ÿฐ ์ƒํ™ฉ์—
Unhandled Exception filter๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€
๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ”„๋กœ๊ทธ๋žจ์˜ dump๋ฅผ ๋œฌ ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œํ‚ค๊ฑฐ๋‚˜ ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜๊ฐ€ ์žˆ๋Š”
๊ฒƒ์ด๋‹ค. ์ด ์„ค์ •์€ windows์˜ SetUnhandledExceptionFilter ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค.
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(
_In_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
LPTOP_LVEL_EXCEPTION_FILTER๋Š” LPEXCEPTION_POINTERS๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ  LONG์„
๋ฆฌํ„ดํ•˜๋Š” WINAPI ํ˜ธ์ถœ ๊ทœ์•ฝ์˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์ด๋‹ค.
( LONG WINAPI filter(LPEXCEPTION_POINTERS * info); )
01 Exception
โ€ข	Dump
ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ์„ ๋•Œ ๋คํ”„ ์ •๋ณด๋ฅผ ๋‚จ๊ธฐ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?๋คํ”„ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ
๋งŒ๋“  ๋‹ค์Œ ์ด ํ•จ์ˆ˜๋ฅผ SetUnhandledExceptionFilter ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋“ฑ๋กํ•˜๋ฉด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€
์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์ž๋™์œผ๋กœ ๋คํ”„ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค„ ๊ฒƒ์ด๋‹ค. ๋คํ”„๋ฅผ ๋งŒ๋“ค๊ธฐ
์œ„ํ•ด MiniDumpWriteDump ํ•จ์ˆ˜๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
BOOL WINAPI MiniDumpWriteDump(
_In_ HANDLE hProcess, // ๋คํ”„ ๋œฐ ํ”„๋กœ์„ธ์Šค ํ•ธ๋“ค
_In_ DWORD ProcessId, // ๋คํ”„ ๋œฐ ํ”„๋กœ์„ธ์Šค ์•„์ด๋””
_In_ HANDLE hFile, // ๋คํ”„ ๊ธฐ๋กํ•  ํŒŒ์ผ ํ•ธ๋“ค
_In_ MINIDUMP_TYPE DumpType, // ๊ธฐ๋กํ•  ๋คํ”„์˜ ํƒ€์ž…(ํ›„์ˆ )
//๋คํ”„ ๋œฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋งŒ๋“  ์˜ˆ์™ธ ์ •๋ณด(NULL์ด๋ฉด ๊ธฐ๋ก๋˜์ง€ ์•Š์Œ)
_In_ PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
//๋คํ”„ ํŒŒ์ผ์— ๊ธฐ๋กํ•  ์‚ฌ์šฉ์ž ์ •์˜ ์ •๋ณด(NULL์ด๋ฉด ๊ธฐ๋ก๋˜์ง€ ์•Š์Œ)
_In_ PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
//ํ™•์žฅ๋œ ๋ฏธ๋‹ˆ ๋คํ”„ ์ •๋ณด๋ฅผ ๋ฐ›์„ ์ฝœ๋ฐฑ ๋ฃจํ‹ด(NULL์ด๋ฉด ์•„๋ฌด ์ฝœ๋ฐฑ๋„ ํ˜ธ์ถœ ์•ˆ ๋จ)
_In_ PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);
01 Exception
โ€ข	Dump
์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ MiniDump์˜ ํƒ€์ž…์—๋Š” ๊ต‰์žฅํžˆ ๋งŽ์€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ์ „์ฒด ๋ชฉ๋ก ๋ฐ ๊ฐ๊ฐ์˜
๊ธฐ๋Šฅ์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด MSDN์˜ MINIDUMP_TYPE ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ๋œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ 2๊ฐ€์ง€๋Š”
MiniDumpNormal๊ณผ MiniDumpWithFullMemory์ด๋‹ค. MiniDumpNormal์€ ๋กœ์ปฌ
๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ํฌํ•จํ•ด์„œ ๋คํ”„๋ฅผ ๋œจ๊ณ , MiniDumpWithFullMemory๋Š” ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์„
ํฌํ•จํ•˜์—ฌ ๋คํ”„๋ฅผ ๋œฌ๋‹ค.
์‚ฌ์šฉ ์˜ˆ์ œ
	 MINIDUMP_EXCEPTION_INFORMATION exceptionInfo;
	 exceptionInfo.ThreadId = GetCurrentThreadId();
	 exceptionInfo.ExceptionPointers = e;
	 exceptionInfo.ClientPointers = FALSE;
	 HANDLE hProcess = GetCurrentProcess();
	 DWORD dwProcessID = GetCurrentProcessId();
	 DWORD dwThreadID = GetCurrentThreadId();
	 MiniDumpWriteDump(hProcess, dwProcessId, hFile,
				MiniDumpWithFullMemory, &exceptionInfo, NULL, NULL);
01 Exception
โ€ข	StackWalk64
์Šค๋ ˆ๋“œ์˜ ์Šคํƒ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด StackWalk64 ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค. ์ธ์ž๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ๊ณ 
๋ณต์žกํ•˜๋‹ค.
BOOL WINAPI StackWalk64(
_In_ DWORD MachineType,
_In_ HANDLE hProcess,
_In_ HANDLE hThread,
_Inout_ LPSTACKFRAME64 StackFrame,
_Inout_ PVOID ContextRecord,
_In_opt_ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
_In_opt_ PFUNCTION_TABLE_ACCESS_ROUTINE64
										FunctionTableAccessRoutine,
_In_opt_ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
_In_opt_ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress
);
01 Exception
โ€ข	StackWalk64
MachineType
์ƒ์„ฑํ•  ์Šคํƒ ์ถ”์  ์ •๋ณด์˜ ์ปดํ“จํ„ฐ ์•„ํ‚คํ…์ณ ์ข…๋ฅ˜์ด๋‹ค. ์•„๋ž˜ 3๊ฐ€์ง€ ๊ฐ’์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง„๋‹ค.
โ€ข	IMAGE_FILE_MACHINE_I386 Intel x86 ์•„ํ‚คํ…์ณ
โ€ข	IMAGE_FILE_MACHINE_IA64 Intel Itanium ์•„ํ‚คํ…์ณ
โ€ข	IMAGE_FILE_MACHINE_AMD64 x64(AMD64 or EM64T) ์•„ํ‚คํ…์ณ
hProcess, hThread
์Šคํƒ์„ ์ถ”์ ํ•  ํ”„๋กœ์„ธ์Šค ๋ฐ ์Šค๋ ˆ๋“œ ํ•ธ๋“ค.
StackFrame
STACKFRAME64 ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ. StackWalk64 ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉด
์ด ํฌ์ธํ„ฐ์— ๋‹ค์Œ ์Šคํƒ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.
01 Exception
โ€ข	StackWalk64
ContextRecord
CONTEXT ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ. MachineType ์ธ์ž๊ฐ€ IMAGE_FILE_MACHINE_I386
์ด ์•„๋‹ ๋•Œ๋งŒ ํ•„์š”ํ•˜๋‹ค(ํ•ด๋‹น MachineType์ด ์•„๋‹ˆ๋ผ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ context record
๊ฐ’์„ ๋„˜๊ธฐ๋Š”๊ฒŒ ๊ถŒ์žฅ๋œ๋‹ค๊ณ  ํ•จ). ์ด ์ธ์ž๋กœ ๋„˜์–ด๊ฐ„ ContextRecord ๊ฐ’์€ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋‹ค.
RtlCaptureContext ํ•จ์ˆ˜๋กœ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
ReadMemoryRoutine
๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๋ฐ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’
(ReadProcessMemoryPros64)๋กœ ์ง€์ •๋จ.
FunctionTableAccessRoutine (optional)
ํ”„๋กœ์„ธ์Šค์˜ run time function table์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ง€์ •.
SymFunctionTableAccess64 ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณดํ†ต ์“ด๋‹ค๊ณ  ํ•œ๋‹ค
01 Exception
โ€ข	StackWalk64
GetModuleBaseRoutine(optional)
์ฃผ์–ด์ง„ ๊ฐ€์ƒํ•จ์ˆ˜์— ๋Œ€ํ•œ module base๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜. ๋ณดํ†ต SymGetModuleBase64
ํ•จ์ˆ˜๋ฅผ ์“ด๋‹ค๊ณ  ํ•จ.
TranslateAddress(optional)
16๋น„ํŠธ ์ฃผ์†Œ์— ๋Œ€ํ•œ ๋ณ€ํ™˜์„ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜. ํ•„์š”์—†์œผ๋ฉด NULL์„ ๋„˜๊ธด๋‹ค.
01 Exception
โ€ข	StackWalk64
์‚ฌ์šฉ ์˜ˆ์ œ
StackWalk64๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ณ€์ˆ˜๋“ค
BOOL res;
HANDLE hProcess;
HANDLE hThread;
CONTEXT context = {0, };
STACKFRAME64 stack = {0, };
ULONG frame;
const int MaxNameLen = 255;
SYMBOL_INFO* symbol =
		(SYMBOL_INFO*)malloc(sizeof(SYMBOL_INFO) + MaxNameLen);
DWORD64 displacement64 = 0;
DWORD displacement = 0;
IMAGEHLP_LINE64 imageHelpLine;
DWORD dwSymOptions = SymGetOptions();
01 Exception
โ€ข	StackWalk64
์‚ฌ์šฉ ์˜ˆ์ œ
Symbol Option ์ดˆ๊ธฐํ™”
dwSymOptions |= SYMOPT_LOAD_LINES;
dwSymOptions |= SYMOPT_UNDNAME;
dwSymOptions |= SYMOPT_EXACT_SYMBOLS;
SymSetOptions(dwSymOptions);
memset(symbol, 0, sizeof(SYMBOL_INFO) + MaxNameLen);
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
symbol->MaxNameLen = MaxNameLen;
memset(&imageHelpLine, 0, sizeof(imageHelpLine));
imageHelpLine.SizeOfStruct = sizeof(imageHelpLine);
SymInitialize(GetCurrentProcess(), ".", 1);
01 Exception
โ€ข	StackWalk64
์‚ฌ์šฉ ์˜ˆ์ œ
stack ๊ตฌ์กฐ์ฒด ์ดˆ๊ธฐํ™” ๋ฐ context ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
RtlCaptureContext(&context);
memset(&stack, 0, sizeof(STACKFRAME64));
hProcess = GetCurrentProcess();
hThread = GetCurrentThread();
stack.AddrPC.Offset = context.Eip;
stack.AddrPC.Mode = AddrModeFlat;
stack.AddrStack.Offset = context.Esp;
stack.AddrStack.Mode = AddrModeFlat;
stack.AddrFrame.Offset = context.Ebp;
stack.AddrFrame.Mode = AddrModeFlat;
stack.AddrBStore.Mode = AddrModeFlat;
stack.AddrReturn.Mode = AddrModeFlat;
01 Exception
โ€ข	StackWalk64
์‚ฌ์šฉ ์˜ˆ์ œ
์Šคํƒ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
for (frame = 0;; frame++)
{
	 res = StackWalk64
	(
		IMAGE_FILE_MACHINE_I386,
		hProcess,
		hThread,
		&stack,
		&context,
		NULL,
		SymFunctionTableAccess64,
		SymGetModuleBase64,
		NULL
	);
01 Exception
โ€ข	StackWalk64
์‚ฌ์šฉ ์˜ˆ์ œ
์‹ฌ๋ณผ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์ถœ๋ ฅ
		SymFromAddr(hProcess, stack.AddrPC.Offset,
						&displacement64, symbol);
		SymGetLineFromAddr64(hProcess, stack.AddrPC.Offset,
						&displacement, &imageHelpLine);
		printf
			(
			"Frame %lu:nSymbol name: %snFile Name : %sn"
			 "Line Number : %dnPC address: 0x%08LXn"
			"Frame address: 0x%08LXn",
			frame, symbol->Name, imageHelpLine.FileName,
			imageHelpLine.LineNumber, (ULONG64)stack.AddrPC.Offset,
			(ULONG64)stack.AddrStack.Offset,
			(ULONG64)stack.AddrFrame.Offset
			);
01 Exception
โ€ข	StackWalk64
์‚ฌ์šฉ ์˜ˆ์ œ
๋งˆ๋ฌด๋ฆฌ
		if (!res)
		{
			break;
		}
	}
	 SymCleanup(hProcess);
	 free(symbol);
}
02
Log
02 Log
โ€ข	C++ Log Library
C++์—๋Š” ์ด๋ฏธ ์ž˜ ๋งŒ๋“ค์–ด์ง„ ๋กœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋งŽ๋‹ค. ๊ทธ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋งŒ ์‚ดํŽด๋ณด์ž.
glog
๊ตฌ๊ธ€์—์„œ ๋งŒ๋“  C++ ๋กœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์˜ ๋กœ๊น…์„ ๊ตฌํ˜„. ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ๋งŒ ๋กœ
๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ, ํŠน์ • ์ƒํƒœ์—์„œ๋งŒ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ธฐ๋Šฅ ๋“ฑ๋“ฑ์„ ์ง€์›ํ•œ๋‹ค.
์‚ฌ์šฉ๋ฒ• ๊ด€๋ จ ๋งํฌ : http://jjalidev.blogspot.kr/2013/10/glog.html
log4Cxx
log4j๋ฅผ ๋ณธ๋”ฐ C++ ๋ฒ„์ ผ์œผ๋กœ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ๋น ๋ฅด๊ณ  ํ™•์žฅ์„ฑ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค. ํ‰๊ฐ€๊ฐ€ ์ข‹์€ ํŽธ์ด
์ง€๋งŒ 2008๋…„ ์ดํ›„๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†๋‹ค.
์‚ฌ์šฉ๋ฒ• ๊ด€๋ จ ๋งํฌ : http://mindgear.tistory.com/184
02 Log
โ€ข	Boost::log
C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ค‘ ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๊ณ  ๋งŽ์ด ์“ฐ์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ log ๊ธฐ๋Šฅ์„
ํ•œ ๋ฒˆ ์จ๋ณด์ž. Boost ์„ค์น˜๋Š” ๋งํฌ ์ฐธ์กฐ. ๊ธ€์— ์ ํžŒ ๊ฑธ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€
์•Š๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. Simplicity, Extensibility, Performance๋ฅผ ๊ฐ€์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชฉํ‘œ๋กœ
๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•จ. ๋ฉ”๋‰ด์–ผ ๋งํฌ
02 Log
โ€ข	Boost::log
๊ฐ„๋žตํ•œ ๊ตฌ์กฐ ์„ค๋ช…( ์•ž ์Šฌ๋ผ์ด๋“œ์˜ ๊ทธ๋ฆผ ์ฐธ์กฐ)
Logging Sources
logger๋Š” ์‹ค์ œ ๊ธฐ๋ก๋  ๋ฉ”์‹œ์ง€๋ฅผ ํ˜•์‹ํ™”(format)ํ•˜๊ธฐ ์œ„ํ•œ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ์˜ค๋ธŒ์ ํŠธ๋‹ค.
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋‹ค์–‘ํ•œ logger๋ฅผ ์ง€์›ํ•˜๋ฉฐ ์ง์ ‘ logger๋ฅผ ๋งŒ๋“ค์–ด ์“ฐ๊ฑฐ๋‚˜ ํ™•์žฅํ•ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.
Attributes and attribute values
log source๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” log record์— ๊ด€๋ จ๋œ ๋ชจ๋“  ์ •๋ณด๋ฅผ logging core์— ๋„˜๊ฒจ์ฃผ
์–ด์•ผํ•œ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋“ค์€ attribute๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ์˜ attribute๋“ค์€ ๊ธฐ๋ณธ
์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์ด๋‹ค. attribute set์—๋Š” global / thread-specific, source-specific์˜
์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.
Logging core and filtering
attribute value ์ง‘ํ•ฉ์ด ๋ชจ๋‘ ๊ตฌ์„ฑ๋˜๋ฉด, logging core๋Š” ํ•ด๋‹น log record๊ฐ€ ๊ธฐ๋ก๋˜์–ด์•ผ ํ•˜๋Š”
log์ธ์ง€ ํŒ๋‹จํ•˜๊ณ  ํ•„์š”์—†์œผ๋ฉด ๋ฒ„๋ฆฐ๋‹ค(filtering).
Sinks and formatting
ํ•„ํ„ฐ๋ง์„ ํ†ต๊ณผํ•˜๋ฉด ํ•ด๋‹น record๋ฅผ ์ ์ ˆํžˆ ํ˜•์‹ํ™”ํ•ด์„œ ํ•ด๋‹น record๊ฐ€ ๊ธฐ๋ก๋˜์–ด์•ผ ํ•  sink๋กœ ๋ณด
๋‚ธ๋‹ค. front-end / back-end๋กœ ๊ตฌ์„ฑ.
02 Log
โ€ข	Boost::log
Trivial logging
์ œ์ผ ๊ฐ„๋‹จํ•œ ๋กœ๊น…. ๊ทธ๋ƒฅ ํ•ด๋‹น ๋ฉ”์‹œ์ง€ ์ฝ˜์†” ์ฐฝ์— ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค(std::cout).
#include <boost/log/trivial.hpp>
int main()
{
	 BOOST_LOG_TRIVIAL(trace) << "A trace severity message";
	 BOOST_LOG_TRIVIAL(debug) << "A debug severity message";
	 BOOST_LOG_TRIVIAL(info) << "An informational severity message";
	 BOOST_LOG_TRIVIAL(warning) << "A warning severity message";
	 BOOST_LOG_TRIVIAL(error) << "An error severity message";
	 BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";
	 return 0;
}
02 Log
โ€ข	Boost::log
Setup Sink
log๊ฐ€ ์ถœ๋ ฅ๋  sink๋ฅผ ์ง์ ‘ ์„ค์ •ํ•ด์„œ ์“ฐ๊ธฐ.
namespace logging = boost::log;
namespace src = boost::log::sources;
namespace sinks = boost::log::sinks;
namespace keywords = boost::log::keywords;
int main()
{
	 using namespace logging::trivial;
	 logging::add_file_log
	(
		keywords::file_name =
				"sample_%N.log",
		keywords::rotation_size =
				 10 * 1024 * 1024,
		keywords::format =
				"[%TimeStamp%] : %Message%"
	);
	 logging::core::get()->set_filter
	(
		severity >= info
	);
	 logging::add_common_attributes();
	 src::severity_logger<severity_level> lg;
	 BOOST_LOG_SEV(lg, trace) <<
		"A trace severity message";
	 BOOST_LOG_SEV(lg, debug) <<
		"A debug severity message";
	 BOOST_LOG_SEV(lg, info) <<
		"An informational severity message";
	 BOOST_LOG_SEV(lg, warning) <<
		"A warning severity message";
	 BOOST_LOG_SEV(lg, error) <<
		"An error severity message";
	 BOOST_LOG_SEV(lg, fatal) <<
		"A fatal severity message";
	 return 0;
}
์‚ฌ์šฉ๋ฒ•์ด ์ƒ๋‹นํžˆ ๋ฐฉ๋Œ€ํ•ด์„œ ์˜ˆ์ œ๋Š” ์ด์ •๋„๋กœ..
๋ฉ”๋‰ด์–ผ ๋ฌธ์„œ์— ํŠœํ† ๋ฆฌ์–ผ์ด ๊ต‰์žฅํžˆ ์ž˜ ์ •๋ฆฌ๋˜์–ด
์žˆ์œผ๋‹ˆ ๊ทธ๊ฑธ ์ฐธ๊ณ ํ•˜์ž!
02 Log
โ€ข	๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์—์„œ์˜ ๋กœ๊ทธ
์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์—์„œ๋Š” ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ์—ญ์‹œ๋‚˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค. ์—ฌ๋Ÿฌ ์Šค
๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ด๋Ÿฐ ์ €๋Ÿฐ ๋‚ด์šฉ๋“ค์„ ๋กœ๊น…ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ˆœ์„œ๊ฐ€ ๊ผฌ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. boost ๊ฐ™
์€ ๊ฒฝ์šฐ์—๋Š” sink์—์„œ frond-end์™€ back-end๋ฅผ ๋‚˜๋ˆˆ ๋’ค front-end์—์„œ ์Šค๋ ˆ๋“œ๊ฐ„ ๋™๊ธฐํ™” ๋“ฑ
์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  back-end์—์„œ ์‹ค์ œ๋กœ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹์œผ๋กœ ์ด
๋Ÿฐ ์ˆœ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค(์‹ค์ œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค). ๊ฐœ์ธ์ ์œผ๋กœ
์ƒ๊ฐํ•˜๊ธฐ์—๋Š” ์•„๋ž˜ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ •๋„๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
queue ์ด์šฉํ•˜๊ธฐ
thread-safeํ•œ queue๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฑฐ๊ธฐ ๋กœ๊ทธํ•  ๋‚ด์šฉ์„ ์ง‘์–ด๋„ฃ์€ ๋’ค ๊บผ๋‚ด์„œ ์‹ค์ œ๋กœ ๊ธฐ๋กํ•˜๋Š”
๊ฒƒ์ด๋‹ค.
GCE ๊ฐ™์€ ๊ตฌ์กฐ ์ด์šฉํ•˜๊ธฐ
์ฝ”๋”ฉ ๊ณผ์ œ์— ์žˆ๋Š” GCE ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๋งŒ๋“ค๋ฉด lock ์•ˆ ๊ฑธ๊ณ  ์ˆœ์„œ ๋ณด์žฅํ•˜๋Š” log ๊ธฐ๋ก์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™
๋‹ค.(GCE๋„ ๊ทธ๋Ÿฐ ์—ญํ• ์„ ํ•˜๋‹ˆ๊นŒ) log๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์• ๊ฐ€ ์•„๋ฌด๋„ ์—†์œผ๋ฉด ์ง์ ‘ ๊ธฐ๋กํ•˜๊ณ , ๋ˆ„๊ตฐ๊ฐ€ log
๋ฅผ ๊ธฐ๋ก ์ค‘์ด๋ผ๋ฉด ๊ฑ”ํ•œํ…Œ ์ž๊ธฐ๊ฐ€ ํ•ด์•ผํ•  log๊นŒ์ง€ ๋– ๋งก๊ธฐ๊ณ  ๊ทธ๋ƒฅ ์ž๊ธฐ ํ•  ์ผ ํ•˜๋Š” ๋ฐฉ์‹.

More Related Content

What's hot

์‰ฝ๊ฒŒ ์“ฐ์—ฌ์ง„ Django
์‰ฝ๊ฒŒ ์“ฐ์—ฌ์ง„ Django์‰ฝ๊ฒŒ ์“ฐ์—ฌ์ง„ Django
์‰ฝ๊ฒŒ ์“ฐ์—ฌ์ง„ Django
Taehoon Kim
ย 
์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€์ด๋“œ
์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€์ด๋“œ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€์ด๋“œ
์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€์ด๋“œ
๋„ํ˜• ์ž„
ย 
์ž๋™ํ™”๋œ ์†Œ์Šค ๋ถ„์„, ์ฒ˜๋ฆฌ, ๊ฒ€์ฆ์„ ํ†ตํ•œ ์†Œ์Šค์˜ ๋ถˆํ•„์š”ํ•œ #if - #endif ์ œ๊ฑฐํ•˜๊ธฐ NDC2012
์ž๋™ํ™”๋œ ์†Œ์Šค ๋ถ„์„, ์ฒ˜๋ฆฌ, ๊ฒ€์ฆ์„ ํ†ตํ•œ ์†Œ์Šค์˜ ๋ถˆํ•„์š”ํ•œ #if - #endif ์ œ๊ฑฐํ•˜๊ธฐ NDC2012์ž๋™ํ™”๋œ ์†Œ์Šค ๋ถ„์„, ์ฒ˜๋ฆฌ, ๊ฒ€์ฆ์„ ํ†ตํ•œ ์†Œ์Šค์˜ ๋ถˆํ•„์š”ํ•œ #if - #endif ์ œ๊ฑฐํ•˜๊ธฐ NDC2012
์ž๋™ํ™”๋œ ์†Œ์Šค ๋ถ„์„, ์ฒ˜๋ฆฌ, ๊ฒ€์ฆ์„ ํ†ตํ•œ ์†Œ์Šค์˜ ๋ถˆํ•„์š”ํ•œ #if - #endif ์ œ๊ฑฐํ•˜๊ธฐ NDC2012Esun Kim
ย 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.js
Dinesh U
ย 
Chrome DevToolsแ„…แ…ฉ JS แ„†แ…ฆแ„†แ…ฉแ„…แ…ตแ„…แ…ตแ†จ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผแ„’แ…กแ„€แ…ต.pptx
Chrome DevToolsแ„…แ…ฉ JS แ„†แ…ฆแ„†แ…ฉแ„…แ…ตแ„…แ…ตแ†จ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผแ„’แ…กแ„€แ…ต.pptxChrome DevToolsแ„…แ…ฉ JS แ„†แ…ฆแ„†แ…ฉแ„…แ…ตแ„…แ…ตแ†จ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผแ„’แ…กแ„€แ…ต.pptx
Chrome DevToolsแ„…แ…ฉ JS แ„†แ…ฆแ„†แ…ฉแ„…แ…ตแ„…แ…ตแ†จ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผแ„’แ…กแ„€แ…ต.pptx
Eunsu Kim
ย 
Ajax and PHP
Ajax and PHPAjax and PHP
Ajax and PHP
John Coggeshall
ย 
Fiddler: ์›น ๋””๋ฒ„๊น… ํ”„๋ก์‹œ
Fiddler: ์›น ๋””๋ฒ„๊น… ํ”„๋ก์‹œFiddler: ์›น ๋””๋ฒ„๊น… ํ”„๋ก์‹œ
Fiddler: ์›น ๋””๋ฒ„๊น… ํ”„๋ก์‹œ
Taegon Kim
ย 
PYCON KR 2017 - ๊ตฌ๋ฆ„์ด ํ•˜๋Š˜์˜ ์ผ์ด๋ผ๋ฉด (์œค์ƒ์›…)
PYCON KR 2017 - ๊ตฌ๋ฆ„์ด ํ•˜๋Š˜์˜ ์ผ์ด๋ผ๋ฉด (์œค์ƒ์›…)PYCON KR 2017 - ๊ตฌ๋ฆ„์ด ํ•˜๋Š˜์˜ ์ผ์ด๋ผ๋ฉด (์œค์ƒ์›…)
PYCON KR 2017 - ๊ตฌ๋ฆ„์ด ํ•˜๋Š˜์˜ ์ผ์ด๋ผ๋ฉด (์œค์ƒ์›…)
Haezoom Inc.
ย 
แ„‰แ…ณแ„แ…กแ„แ…ณแ„‹แ…ฅแ†ธแ„Žแ…ฅแ„…แ…ฅแ†ท แ„แ…ฉแ„‹แ…ตแ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„’แ…กแ„€แ…ต
แ„‰แ…ณแ„แ…กแ„แ…ณแ„‹แ…ฅแ†ธแ„Žแ…ฅแ„…แ…ฅแ†ท แ„แ…ฉแ„‹แ…ตแ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„’แ…กแ„€แ…ตแ„‰แ…ณแ„แ…กแ„แ…ณแ„‹แ…ฅแ†ธแ„Žแ…ฅแ„…แ…ฅแ†ท แ„แ…ฉแ„‹แ…ตแ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„’แ…กแ„€แ…ต
แ„‰แ…ณแ„แ…กแ„แ…ณแ„‹แ…ฅแ†ธแ„Žแ…ฅแ„…แ…ฅแ†ท แ„แ…ฉแ„‹แ…ตแ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„’แ…กแ„€แ…ต
Sunyoung Shin
ย 
[NDC2016] TERA ์„œ๋ฒ„์˜ Modern C++ ํ™œ์šฉ๊ธฐ
[NDC2016] TERA ์„œ๋ฒ„์˜ Modern C++ ํ™œ์šฉ๊ธฐ[NDC2016] TERA ์„œ๋ฒ„์˜ Modern C++ ํ™œ์šฉ๊ธฐ
[NDC2016] TERA ์„œ๋ฒ„์˜ Modern C++ ํ™œ์šฉ๊ธฐ
Sang Heon Lee
ย 
Django์˜ ๋ฐฐ์‹ (์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž์˜ Django ์‚ฝ์งˆ๊ธฐ)
Django์˜ ๋ฐฐ์‹ (์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž์˜ Django ์‚ฝ์งˆ๊ธฐ)Django์˜ ๋ฐฐ์‹ (์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž์˜ Django ์‚ฝ์งˆ๊ธฐ)
Django์˜ ๋ฐฐ์‹ (์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž์˜ Django ์‚ฝ์งˆ๊ธฐ)
Eunhyang Kim
ย 
์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜ 2014.03
์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜   2014.03์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜   2014.03
์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜ 2014.03
Changyol BAEK
ย 
Web fundamentals - part 1
Web fundamentals - part 1Web fundamentals - part 1
Web fundamentals - part 1
Bozhidar Boshnakov
ย 
Overlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œ
Overlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œOverlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œ
Overlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œ
Kwen Won Lee
ย 
Modern C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ CPP11/14 ํ•ต์‹ฌ
Modern C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ CPP11/14 ํ•ต์‹ฌModern C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ CPP11/14 ํ•ต์‹ฌ
Modern C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ CPP11/14 ํ•ต์‹ฌํฅ๋ฐฐ ์ตœ
ย 
Scouter์™€ influx db โ€“ grafana ์—ฐ๋™ ๊ฐ€์ด๋“œ
Scouter์™€ influx db โ€“ grafana ์—ฐ๋™ ๊ฐ€์ด๋“œScouter์™€ influx db โ€“ grafana ์—ฐ๋™ ๊ฐ€์ด๋“œ
Scouter์™€ influx db โ€“ grafana ์—ฐ๋™ ๊ฐ€์ด๋“œ
Ji-Woong Choi
ย 
Optional in Java 8
Optional in Java 8Optional in Java 8
Optional in Java 8Richard Walker
ย 
[2018] Java๋ฅผ ์œ„ํ•œ, Java์— ์˜ํ•œ ๋„๊ตฌ๋“ค
[2018] Java๋ฅผ ์œ„ํ•œ, Java์— ์˜ํ•œ ๋„๊ตฌ๋“ค[2018] Java๋ฅผ ์œ„ํ•œ, Java์— ์˜ํ•œ ๋„๊ตฌ๋“ค
[2018] Java๋ฅผ ์œ„ํ•œ, Java์— ์˜ํ•œ ๋„๊ตฌ๋“ค
NHN FORWARD
ย 
์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒ€ํ”„๋กœ์ ํŠธ ์ตœ์ข…๋ฐœํ‘œ
์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒ€ํ”„๋กœ์ ํŠธ ์ตœ์ข…๋ฐœํ‘œ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒ€ํ”„๋กœ์ ํŠธ ์ตœ์ข…๋ฐœํ‘œ
์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒ€ํ”„๋กœ์ ํŠธ ์ตœ์ข…๋ฐœํ‘œ
Seong Heum Park
ย 
Django, What is it, Why is it cool?
Django, What is it, Why is it cool?Django, What is it, Why is it cool?
Django, What is it, Why is it cool?
Tom Brander
ย 

What's hot (20)

์‰ฝ๊ฒŒ ์“ฐ์—ฌ์ง„ Django
์‰ฝ๊ฒŒ ์“ฐ์—ฌ์ง„ Django์‰ฝ๊ฒŒ ์“ฐ์—ฌ์ง„ Django
์‰ฝ๊ฒŒ ์“ฐ์—ฌ์ง„ Django
ย 
์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€์ด๋“œ
์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€์ด๋“œ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€์ด๋“œ
์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€์ด๋“œ
ย 
์ž๋™ํ™”๋œ ์†Œ์Šค ๋ถ„์„, ์ฒ˜๋ฆฌ, ๊ฒ€์ฆ์„ ํ†ตํ•œ ์†Œ์Šค์˜ ๋ถˆํ•„์š”ํ•œ #if - #endif ์ œ๊ฑฐํ•˜๊ธฐ NDC2012
์ž๋™ํ™”๋œ ์†Œ์Šค ๋ถ„์„, ์ฒ˜๋ฆฌ, ๊ฒ€์ฆ์„ ํ†ตํ•œ ์†Œ์Šค์˜ ๋ถˆํ•„์š”ํ•œ #if - #endif ์ œ๊ฑฐํ•˜๊ธฐ NDC2012์ž๋™ํ™”๋œ ์†Œ์Šค ๋ถ„์„, ์ฒ˜๋ฆฌ, ๊ฒ€์ฆ์„ ํ†ตํ•œ ์†Œ์Šค์˜ ๋ถˆํ•„์š”ํ•œ #if - #endif ์ œ๊ฑฐํ•˜๊ธฐ NDC2012
์ž๋™ํ™”๋œ ์†Œ์Šค ๋ถ„์„, ์ฒ˜๋ฆฌ, ๊ฒ€์ฆ์„ ํ†ตํ•œ ์†Œ์Šค์˜ ๋ถˆํ•„์š”ํ•œ #if - #endif ์ œ๊ฑฐํ•˜๊ธฐ NDC2012
ย 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.js
ย 
Chrome DevToolsแ„…แ…ฉ JS แ„†แ…ฆแ„†แ…ฉแ„…แ…ตแ„…แ…ตแ†จ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผแ„’แ…กแ„€แ…ต.pptx
Chrome DevToolsแ„…แ…ฉ JS แ„†แ…ฆแ„†แ…ฉแ„…แ…ตแ„…แ…ตแ†จ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผแ„’แ…กแ„€แ…ต.pptxChrome DevToolsแ„…แ…ฉ JS แ„†แ…ฆแ„†แ…ฉแ„…แ…ตแ„…แ…ตแ†จ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผแ„’แ…กแ„€แ…ต.pptx
Chrome DevToolsแ„…แ…ฉ JS แ„†แ…ฆแ„†แ…ฉแ„…แ…ตแ„…แ…ตแ†จ แ„ƒแ…ตแ„‡แ…ฅแ„€แ…ตแ†ผแ„’แ…กแ„€แ…ต.pptx
ย 
Ajax and PHP
Ajax and PHPAjax and PHP
Ajax and PHP
ย 
Fiddler: ์›น ๋””๋ฒ„๊น… ํ”„๋ก์‹œ
Fiddler: ์›น ๋””๋ฒ„๊น… ํ”„๋ก์‹œFiddler: ์›น ๋””๋ฒ„๊น… ํ”„๋ก์‹œ
Fiddler: ์›น ๋””๋ฒ„๊น… ํ”„๋ก์‹œ
ย 
PYCON KR 2017 - ๊ตฌ๋ฆ„์ด ํ•˜๋Š˜์˜ ์ผ์ด๋ผ๋ฉด (์œค์ƒ์›…)
PYCON KR 2017 - ๊ตฌ๋ฆ„์ด ํ•˜๋Š˜์˜ ์ผ์ด๋ผ๋ฉด (์œค์ƒ์›…)PYCON KR 2017 - ๊ตฌ๋ฆ„์ด ํ•˜๋Š˜์˜ ์ผ์ด๋ผ๋ฉด (์œค์ƒ์›…)
PYCON KR 2017 - ๊ตฌ๋ฆ„์ด ํ•˜๋Š˜์˜ ์ผ์ด๋ผ๋ฉด (์œค์ƒ์›…)
ย 
แ„‰แ…ณแ„แ…กแ„แ…ณแ„‹แ…ฅแ†ธแ„Žแ…ฅแ„…แ…ฅแ†ท แ„แ…ฉแ„‹แ…ตแ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„’แ…กแ„€แ…ต
แ„‰แ…ณแ„แ…กแ„แ…ณแ„‹แ…ฅแ†ธแ„Žแ…ฅแ„…แ…ฅแ†ท แ„แ…ฉแ„‹แ…ตแ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„’แ…กแ„€แ…ตแ„‰แ…ณแ„แ…กแ„แ…ณแ„‹แ…ฅแ†ธแ„Žแ…ฅแ„…แ…ฅแ†ท แ„แ…ฉแ„‹แ…ตแ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„’แ…กแ„€แ…ต
แ„‰แ…ณแ„แ…กแ„แ…ณแ„‹แ…ฅแ†ธแ„Žแ…ฅแ„…แ…ฅแ†ท แ„แ…ฉแ„‹แ…ตแ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณแ„’แ…กแ„€แ…ต
ย 
[NDC2016] TERA ์„œ๋ฒ„์˜ Modern C++ ํ™œ์šฉ๊ธฐ
[NDC2016] TERA ์„œ๋ฒ„์˜ Modern C++ ํ™œ์šฉ๊ธฐ[NDC2016] TERA ์„œ๋ฒ„์˜ Modern C++ ํ™œ์šฉ๊ธฐ
[NDC2016] TERA ์„œ๋ฒ„์˜ Modern C++ ํ™œ์šฉ๊ธฐ
ย 
Django์˜ ๋ฐฐ์‹ (์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž์˜ Django ์‚ฝ์งˆ๊ธฐ)
Django์˜ ๋ฐฐ์‹ (์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž์˜ Django ์‚ฝ์งˆ๊ธฐ)Django์˜ ๋ฐฐ์‹ (์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž์˜ Django ์‚ฝ์งˆ๊ธฐ)
Django์˜ ๋ฐฐ์‹ (์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž์˜ Django ์‚ฝ์งˆ๊ธฐ)
ย 
์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜ 2014.03
์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜   2014.03์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜   2014.03
์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜ 2014.03
ย 
Web fundamentals - part 1
Web fundamentals - part 1Web fundamentals - part 1
Web fundamentals - part 1
ย 
Overlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œ
Overlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œOverlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œ
Overlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œ
ย 
Modern C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ CPP11/14 ํ•ต์‹ฌ
Modern C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ CPP11/14 ํ•ต์‹ฌModern C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ CPP11/14 ํ•ต์‹ฌ
Modern C++ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ CPP11/14 ํ•ต์‹ฌ
ย 
Scouter์™€ influx db โ€“ grafana ์—ฐ๋™ ๊ฐ€์ด๋“œ
Scouter์™€ influx db โ€“ grafana ์—ฐ๋™ ๊ฐ€์ด๋“œScouter์™€ influx db โ€“ grafana ์—ฐ๋™ ๊ฐ€์ด๋“œ
Scouter์™€ influx db โ€“ grafana ์—ฐ๋™ ๊ฐ€์ด๋“œ
ย 
Optional in Java 8
Optional in Java 8Optional in Java 8
Optional in Java 8
ย 
[2018] Java๋ฅผ ์œ„ํ•œ, Java์— ์˜ํ•œ ๋„๊ตฌ๋“ค
[2018] Java๋ฅผ ์œ„ํ•œ, Java์— ์˜ํ•œ ๋„๊ตฌ๋“ค[2018] Java๋ฅผ ์œ„ํ•œ, Java์— ์˜ํ•œ ๋„๊ตฌ๋“ค
[2018] Java๋ฅผ ์œ„ํ•œ, Java์— ์˜ํ•œ ๋„๊ตฌ๋“ค
ย 
์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒ€ํ”„๋กœ์ ํŠธ ์ตœ์ข…๋ฐœํ‘œ
์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒ€ํ”„๋กœ์ ํŠธ ์ตœ์ข…๋ฐœํ‘œ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒ€ํ”„๋กœ์ ํŠธ ์ตœ์ข…๋ฐœํ‘œ
์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒ€ํ”„๋กœ์ ํŠธ ์ตœ์ข…๋ฐœํ‘œ
ย 
Django, What is it, Why is it cool?
Django, What is it, Why is it cool?Django, What is it, Why is it cool?
Django, What is it, Why is it cool?
ย 

Viewers also liked

Exception log practical_coding_guide, ์˜ˆ์™ธ์™€ ๋กœ๊ทธ ์ฝ”๋”ฉ ์‹ค์šฉ ๊ฐ€์ด๋“œ
Exception log practical_coding_guide, ์˜ˆ์™ธ์™€ ๋กœ๊ทธ ์ฝ”๋”ฉ ์‹ค์šฉ ๊ฐ€์ด๋“œException log practical_coding_guide, ์˜ˆ์™ธ์™€ ๋กœ๊ทธ ์ฝ”๋”ฉ ์‹ค์šฉ ๊ฐ€์ด๋“œ
Exception log practical_coding_guide, ์˜ˆ์™ธ์™€ ๋กœ๊ทธ ์ฝ”๋”ฉ ์‹ค์šฉ ๊ฐ€์ด๋“œ
๋„ํ˜• ์ž„
ย 
SDC 3rd ์ตœํฅ๋ฐฐ๋‹˜ - Boost.multi_index ์‚ฌ์šฉํ•˜๊ธฐ
SDC 3rd ์ตœํฅ๋ฐฐ๋‹˜ - Boost.multi_index ์‚ฌ์šฉํ•˜๊ธฐSDC 3rd ์ตœํฅ๋ฐฐ๋‹˜ - Boost.multi_index ์‚ฌ์šฉํ•˜๊ธฐ
SDC 3rd ์ตœํฅ๋ฐฐ๋‹˜ - Boost.multi_index ์‚ฌ์šฉํ•˜๊ธฐOnGameServer
ย 
KGC2015_C# ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒŒ์ž„์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๊ฐœ๋ฐœ
KGC2015_C# ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒŒ์ž„์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๊ฐœ๋ฐœKGC2015_C# ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒŒ์ž„์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๊ฐœ๋ฐœ
KGC2015_C# ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒŒ์ž„์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๊ฐœ๋ฐœ
ํฅ๋ฐฐ ์ตœ
ย 
์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •
์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •
์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •
Yoonwhan Lee
ย 
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต_๋ฐ์ดํ„ฐ์ง€๋ŠฅํŒ€_์„ฑ๋™์ฐฌ
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต_๋ฐ์ดํ„ฐ์ง€๋ŠฅํŒ€_์„ฑ๋™์ฐฌH3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต_๋ฐ์ดํ„ฐ์ง€๋ŠฅํŒ€_์„ฑ๋™์ฐฌ
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต_๋ฐ์ดํ„ฐ์ง€๋ŠฅํŒ€_์„ฑ๋™์ฐฌKTH, ์ผ€์ดํ‹ฐํ•˜์ดํ…”
ย 
Mysql old password ๊นจ๊ธฐ
Mysql old password ๊นจ๊ธฐMysql old password ๊นจ๊ธฐ
Mysql old password ๊นจ๊ธฐHyunSeung Kim
ย 
PHP ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ - ์ดํด๋ฆฝ์Šค PDT
PHP ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ - ์ดํด๋ฆฝ์Šค PDTPHP ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ - ์ดํด๋ฆฝ์Šค PDT
PHP ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ - ์ดํด๋ฆฝ์Šค PDT
Young D
ย 
PHP Profiling
PHP ProfilingPHP Profiling
PHP Profiling
Sungbum Hong
ย 
[2015:1] phpdocumentor ์„ค์น˜์™€ ์‚ฌ์šฉ๋ฒ•
[2015:1] phpdocumentor ์„ค์น˜์™€ ์‚ฌ์šฉ๋ฒ•[2015:1] phpdocumentor ์„ค์น˜์™€ ์‚ฌ์šฉ๋ฒ•
[2015:1] phpdocumentor ์„ค์น˜์™€ ์‚ฌ์šฉ๋ฒ•
Amy Kim
ย 
programming with GDB
programming with GDBprogramming with GDB
programming with GDBNakCheon Jung
ย 
๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ๊ธฐ์ˆ  Ch 4
๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ๊ธฐ์ˆ  Ch 4๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ๊ธฐ์ˆ  Ch 4
๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ๊ธฐ์ˆ  Ch 4ukjinkwoun
ย 
xecon-phpfest2014composer
xecon-phpfest2014composerxecon-phpfest2014composer
xecon-phpfest2014composer
jhyeon1010
ย 
NHN NEXT 2014๋…„๋„ แ„€แ…ฆแ„‹แ…ตแ†ทํŠธ๋ž™ แ„‰แ…ฉแ„€แ…ข
NHN NEXT 2014๋…„๋„ แ„€แ…ฆแ„‹แ…ตแ†ทํŠธ๋ž™ แ„‰แ…ฉแ„€แ…ข NHN NEXT 2014๋…„๋„ แ„€แ…ฆแ„‹แ…ตแ†ทํŠธ๋ž™ แ„‰แ…ฉแ„€แ…ข
NHN NEXT 2014๋…„๋„ แ„€แ…ฆแ„‹แ…ตแ†ทํŠธ๋ž™ แ„‰แ…ฉแ„€แ…ข
Seungmo Koo
ย 
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #5 - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•ธ๋“ค๋ง
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #5 - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•ธ๋“ค๋ง๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #5 - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•ธ๋“ค๋ง
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #5 - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•ธ๋“ค๋ง
Seungmo Koo
ย 
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #3
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #3Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #3
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #3
์„ฑ์ผ ํ•œ
ย 
Vim for php
Vim for phpVim for php
Vim for php
Sol Kim
ย 
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #1
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #1Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #1
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #1
์„ฑ์ผ ํ•œ
ย 

Viewers also liked (20)

Exception log practical_coding_guide, ์˜ˆ์™ธ์™€ ๋กœ๊ทธ ์ฝ”๋”ฉ ์‹ค์šฉ ๊ฐ€์ด๋“œ
Exception log practical_coding_guide, ์˜ˆ์™ธ์™€ ๋กœ๊ทธ ์ฝ”๋”ฉ ์‹ค์šฉ ๊ฐ€์ด๋“œException log practical_coding_guide, ์˜ˆ์™ธ์™€ ๋กœ๊ทธ ์ฝ”๋”ฉ ์‹ค์šฉ ๊ฐ€์ด๋“œ
Exception log practical_coding_guide, ์˜ˆ์™ธ์™€ ๋กœ๊ทธ ์ฝ”๋”ฉ ์‹ค์šฉ ๊ฐ€์ด๋“œ
ย 
NLog ์†Œ๊ฐœ
NLog ์†Œ๊ฐœNLog ์†Œ๊ฐœ
NLog ์†Œ๊ฐœ
ย 
SDC 3rd ์ตœํฅ๋ฐฐ๋‹˜ - Boost.multi_index ์‚ฌ์šฉํ•˜๊ธฐ
SDC 3rd ์ตœํฅ๋ฐฐ๋‹˜ - Boost.multi_index ์‚ฌ์šฉํ•˜๊ธฐSDC 3rd ์ตœํฅ๋ฐฐ๋‹˜ - Boost.multi_index ์‚ฌ์šฉํ•˜๊ธฐ
SDC 3rd ์ตœํฅ๋ฐฐ๋‹˜ - Boost.multi_index ์‚ฌ์šฉํ•˜๊ธฐ
ย 
KGC2015_C# ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒŒ์ž„์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๊ฐœ๋ฐœ
KGC2015_C# ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒŒ์ž„์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๊ฐœ๋ฐœKGC2015_C# ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒŒ์ž„์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๊ฐœ๋ฐœ
KGC2015_C# ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒŒ์ž„์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๊ฐœ๋ฐœ
ย 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1
ย 
์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •
์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •
์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •
ย 
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต_๋ฐ์ดํ„ฐ์ง€๋ŠฅํŒ€_์„ฑ๋™์ฐฌ
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต_๋ฐ์ดํ„ฐ์ง€๋ŠฅํŒ€_์„ฑ๋™์ฐฌH3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต_๋ฐ์ดํ„ฐ์ง€๋ŠฅํŒ€_์„ฑ๋™์ฐฌ
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต_๋ฐ์ดํ„ฐ์ง€๋ŠฅํŒ€_์„ฑ๋™์ฐฌ
ย 
Mysql old password ๊นจ๊ธฐ
Mysql old password ๊นจ๊ธฐMysql old password ๊นจ๊ธฐ
Mysql old password ๊นจ๊ธฐ
ย 
PHP ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ - ์ดํด๋ฆฝ์Šค PDT
PHP ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ - ์ดํด๋ฆฝ์Šค PDTPHP ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ - ์ดํด๋ฆฝ์Šค PDT
PHP ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ - ์ดํด๋ฆฝ์Šค PDT
ย 
PHP Profiling
PHP ProfilingPHP Profiling
PHP Profiling
ย 
[2015:1] phpdocumentor ์„ค์น˜์™€ ์‚ฌ์šฉ๋ฒ•
[2015:1] phpdocumentor ์„ค์น˜์™€ ์‚ฌ์šฉ๋ฒ•[2015:1] phpdocumentor ์„ค์น˜์™€ ์‚ฌ์šฉ๋ฒ•
[2015:1] phpdocumentor ์„ค์น˜์™€ ์‚ฌ์šฉ๋ฒ•
ย 
programming with GDB
programming with GDBprogramming with GDB
programming with GDB
ย 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
ย 
๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ๊ธฐ์ˆ  Ch 4
๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ๊ธฐ์ˆ  Ch 4๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ๊ธฐ์ˆ  Ch 4
๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค๋ฅผ ์ง€ํƒฑํ•˜๋Š” ๊ธฐ์ˆ  Ch 4
ย 
xecon-phpfest2014composer
xecon-phpfest2014composerxecon-phpfest2014composer
xecon-phpfest2014composer
ย 
NHN NEXT 2014๋…„๋„ แ„€แ…ฆแ„‹แ…ตแ†ทํŠธ๋ž™ แ„‰แ…ฉแ„€แ…ข
NHN NEXT 2014๋…„๋„ แ„€แ…ฆแ„‹แ…ตแ†ทํŠธ๋ž™ แ„‰แ…ฉแ„€แ…ข NHN NEXT 2014๋…„๋„ แ„€แ…ฆแ„‹แ…ตแ†ทํŠธ๋ž™ แ„‰แ…ฉแ„€แ…ข
NHN NEXT 2014๋…„๋„ แ„€แ…ฆแ„‹แ…ตแ†ทํŠธ๋ž™ แ„‰แ…ฉแ„€แ…ข
ย 
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #5 - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•ธ๋“ค๋ง
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #5 - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•ธ๋“ค๋ง๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #5 - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•ธ๋“ค๋ง
๊ฒŒ์ž„์„œ๋ฒ„ํ”„๋กœ๊ทธ๋ž˜๋ฐ #5 - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•ธ๋“ค๋ง
ย 
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #3
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #3Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #3
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #3
ย 
Vim for php
Vim for phpVim for php
Vim for php
ย 
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #1
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #1Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #1
Laravel แ„…แ…ฉ แ„‡แ…ขแ„‹แ…ฎแ„‚แ…ณแ†ซ แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…กแ„‹แ…ตแ„ƒแ…ณ #1
ย 

Similar to Exception&log

ํฌ์ŠคํŠธ๋ชจํ…œ๋””๋ฒ„๊น…๊ณผ ํ”„๋กœ์„ธ์Šค ๋คํ”„ ์‹ค์ „
ํฌ์ŠคํŠธ๋ชจํ…œ๋””๋ฒ„๊น…๊ณผ ํ”„๋กœ์„ธ์Šค ๋คํ”„ ์‹ค์ „ํฌ์ŠคํŠธ๋ชจํ…œ๋””๋ฒ„๊น…๊ณผ ํ”„๋กœ์„ธ์Šค ๋คํ”„ ์‹ค์ „
ํฌ์ŠคํŠธ๋ชจํ…œ๋””๋ฒ„๊น…๊ณผ ํ”„๋กœ์„ธ์Šค ๋คํ”„ ์‹ค์ „
์ฃผํ•ญ ๋ฐ•
ย 
์ดํŽ™ํ‹ฐ๋ธŒ C++ (7~9)
์ดํŽ™ํ‹ฐ๋ธŒ C++ (7~9)์ดํŽ™ํ‹ฐ๋ธŒ C++ (7~9)
์ดํŽ™ํ‹ฐ๋ธŒ C++ (7~9)์ต์„ฑ ์กฐ
ย 
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
AnselmKim
ย 
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptxWindosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
HolyTak
ย 
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptxWindosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
HolyTak
ย 
Effective c++ chapter 1,2 ์š”์•ฝ
Effective c++ chapter 1,2 ์š”์•ฝEffective c++ chapter 1,2 ์š”์•ฝ
Effective c++ chapter 1,2 ์š”์•ฝ
Nam Hyeonuk
ย 
์ œํ”„๋ฆฌ ๋ฆฌ์ฒ˜์˜ Windows via C/C++ : 8์žฅ ์œ ์ € ๋ชจ๋“œ์—์„œ์˜ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”
์ œํ”„๋ฆฌ ๋ฆฌ์ฒ˜์˜ Windows via C/C++ : 8์žฅ ์œ ์ € ๋ชจ๋“œ์—์„œ์˜ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”์ œํ”„๋ฆฌ ๋ฆฌ์ฒ˜์˜ Windows via C/C++ : 8์žฅ ์œ ์ € ๋ชจ๋“œ์—์„œ์˜ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”
์ œํ”„๋ฆฌ ๋ฆฌ์ฒ˜์˜ Windows via C/C++ : 8์žฅ ์œ ์ € ๋ชจ๋“œ์—์„œ์˜ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”
sung ki choi
ย 
[143] Modern C++ ๋ฌด์กฐ๊ฑด ์จ์•ผ ํ•ด?
[143] Modern C++ ๋ฌด์กฐ๊ฑด ์จ์•ผ ํ•ด?[143] Modern C++ ๋ฌด์กฐ๊ฑด ์จ์•ผ ํ•ด?
[143] Modern C++ ๋ฌด์กฐ๊ฑด ์จ์•ผ ํ•ด?
NAVER D2
ย 
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
Seok-joon Yun
ย 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
Dong Chan Shin
ย 
Boost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒ
Boost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒBoost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒ
Boost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒ
JinTaek Seo
ย 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 ppt
Injae Lee
ย 
Tcpl 14์žฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
Tcpl 14์žฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌTcpl 14์žฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
Tcpl 14์žฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
์žฌ์ • ์ด
ย 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
Ryan Park
ย 
Windows os ์ƒ์—์„œ ํšจ์œจ์ ์ธ ๋คํ”„
Windows os ์ƒ์—์„œ ํšจ์œจ์ ์ธ ๋คํ”„Windows os ์ƒ์—์„œ ํšจ์œจ์ ์ธ ๋คํ”„
Windows os ์ƒ์—์„œ ํšจ์œจ์ ์ธ ๋คํ”„OnGameServer
ย 
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ W.E.L.C.
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ  W.E.L.C.์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ  W.E.L.C.
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ W.E.L.C.Ryan Park
ย 
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
GangSeok Lee
ย 
์œˆ๋„์šฐ ์ปค๋„ ์ต์Šคํ”Œ๋กœ์ž‡
์œˆ๋„์šฐ ์ปค๋„ ์ต์Šคํ”Œ๋กœ์ž‡์œˆ๋„์šฐ ์ปค๋„ ์ต์Šคํ”Œ๋กœ์ž‡
์œˆ๋„์šฐ ์ปค๋„ ์ต์Šคํ”Œ๋กœ์ž‡
Seungyong Lee
ย 

Similar to Exception&log (20)

ํฌ์ŠคํŠธ๋ชจํ…œ๋””๋ฒ„๊น…๊ณผ ํ”„๋กœ์„ธ์Šค ๋คํ”„ ์‹ค์ „
ํฌ์ŠคํŠธ๋ชจํ…œ๋””๋ฒ„๊น…๊ณผ ํ”„๋กœ์„ธ์Šค ๋คํ”„ ์‹ค์ „ํฌ์ŠคํŠธ๋ชจํ…œ๋””๋ฒ„๊น…๊ณผ ํ”„๋กœ์„ธ์Šค ๋คํ”„ ์‹ค์ „
ํฌ์ŠคํŠธ๋ชจํ…œ๋””๋ฒ„๊น…๊ณผ ํ”„๋กœ์„ธ์Šค ๋คํ”„ ์‹ค์ „
ย 
์ดํŽ™ํ‹ฐ๋ธŒ C++ (7~9)
์ดํŽ™ํ‹ฐ๋ธŒ C++ (7~9)์ดํŽ™ํ‹ฐ๋ธŒ C++ (7~9)
์ดํŽ™ํ‹ฐ๋ธŒ C++ (7~9)
ย 
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
[์Šคํ”„๋ง ์Šคํ„ฐ๋”” 1์ผ์ฐจ] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
ย 
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptxWindosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
ย 
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptxWindosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
Windosw via c ์Šคํ„ฐ๋””23์žฅ.pptx
ย 
Effective c++ chapter 1,2 ์š”์•ฝ
Effective c++ chapter 1,2 ์š”์•ฝEffective c++ chapter 1,2 ์š”์•ฝ
Effective c++ chapter 1,2 ์š”์•ฝ
ย 
์ œํ”„๋ฆฌ ๋ฆฌ์ฒ˜์˜ Windows via C/C++ : 8์žฅ ์œ ์ € ๋ชจ๋“œ์—์„œ์˜ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”
์ œํ”„๋ฆฌ ๋ฆฌ์ฒ˜์˜ Windows via C/C++ : 8์žฅ ์œ ์ € ๋ชจ๋“œ์—์„œ์˜ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”์ œํ”„๋ฆฌ ๋ฆฌ์ฒ˜์˜ Windows via C/C++ : 8์žฅ ์œ ์ € ๋ชจ๋“œ์—์„œ์˜ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”
์ œํ”„๋ฆฌ ๋ฆฌ์ฒ˜์˜ Windows via C/C++ : 8์žฅ ์œ ์ € ๋ชจ๋“œ์—์„œ์˜ ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”
ย 
[143] Modern C++ ๋ฌด์กฐ๊ฑด ์จ์•ผ ํ•ด?
[143] Modern C++ ๋ฌด์กฐ๊ฑด ์จ์•ผ ํ•ด?[143] Modern C++ ๋ฌด์กฐ๊ฑด ์จ์•ผ ํ•ด?
[143] Modern C++ ๋ฌด์กฐ๊ฑด ์จ์•ผ ํ•ด?
ย 
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
[C++ korea] effective modern c++ study item 14 declare functions noexcept if ...
ย 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
ย 
Boost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒ
Boost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒBoost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒ
Boost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒ
ย 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 ppt
ย 
Tcpl 14์žฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
Tcpl 14์žฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌTcpl 14์žฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
Tcpl 14์žฅ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
ย 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
ย 
Windows os ์ƒ์—์„œ ํšจ์œจ์ ์ธ ๋คํ”„
Windows os ์ƒ์—์„œ ํšจ์œจ์ ์ธ ๋คํ”„Windows os ์ƒ์—์„œ ํšจ์œจ์ ์ธ ๋คํ”„
Windows os ์ƒ์—์„œ ํšจ์œจ์ ์ธ ๋คํ”„
ย 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2
ย 
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ W.E.L.C.
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ  W.E.L.C.์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ  W.E.L.C.
์นด์‚ฌ ๊ณต๊ฐœ์„ธ๋ฏธ๋‚˜1ํšŒ W.E.L.C.
ย 
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
ย 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8
ย 
์œˆ๋„์šฐ ์ปค๋„ ์ต์Šคํ”Œ๋กœ์ž‡
์œˆ๋„์šฐ ์ปค๋„ ์ต์Šคํ”Œ๋กœ์ž‡์œˆ๋„์šฐ ์ปค๋„ ์ต์Šคํ”Œ๋กœ์ž‡
์œˆ๋„์šฐ ์ปค๋„ ์ต์Šคํ”Œ๋กœ์ž‡
ย 

More from Nam Hyeonuk

Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œNext ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
Nam Hyeonuk
ย 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
Nam Hyeonuk
ย 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14
Nam Hyeonuk
ย 
Haskell study 13
Haskell study 13Haskell study 13
Haskell study 13
Nam Hyeonuk
ย 
Haskell study 12
Haskell study 12Haskell study 12
Haskell study 12
Nam Hyeonuk
ย 
Haskell study 11
Haskell study 11Haskell study 11
Haskell study 11
Nam Hyeonuk
ย 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10
Nam Hyeonuk
ย 
Haskell study 9
Haskell study 9Haskell study 9
Haskell study 9
Nam Hyeonuk
ย 
Haskell study 8
Haskell study 8Haskell study 8
Haskell study 8
Nam Hyeonuk
ย 
Haskell study 7
Haskell study 7Haskell study 7
Haskell study 7
Nam Hyeonuk
ย 
Haskell study 6
Haskell study 6Haskell study 6
Haskell study 6
Nam Hyeonuk
ย 
Haskell study 5
Haskell study 5Haskell study 5
Haskell study 5
Nam Hyeonuk
ย 
Haskell study 4
Haskell study 4Haskell study 4
Haskell study 4
Nam Hyeonuk
ย 
Haskell study 3
Haskell study 3Haskell study 3
Haskell study 3
Nam Hyeonuk
ย 
Haskell study 2
Haskell study 2Haskell study 2
Haskell study 2
Nam Hyeonuk
ย 
Haskell study 1
Haskell study 1Haskell study 1
Haskell study 1
Nam Hyeonuk
ย 
Haskell study 0
Haskell study 0Haskell study 0
Haskell study 0
Nam Hyeonuk
ย 
Multi thread
Multi threadMulti thread
Multi thread
Nam Hyeonuk
ย 
Database
DatabaseDatabase
Database
Nam Hyeonuk
ย 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
Nam Hyeonuk
ย 

More from Nam Hyeonuk (20)

Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œNext ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
Next ๊ฒŒ์ž„ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์Šฌ๋ผ์ด๋“œ
ย 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
ย 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14
ย 
Haskell study 13
Haskell study 13Haskell study 13
Haskell study 13
ย 
Haskell study 12
Haskell study 12Haskell study 12
Haskell study 12
ย 
Haskell study 11
Haskell study 11Haskell study 11
Haskell study 11
ย 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10
ย 
Haskell study 9
Haskell study 9Haskell study 9
Haskell study 9
ย 
Haskell study 8
Haskell study 8Haskell study 8
Haskell study 8
ย 
Haskell study 7
Haskell study 7Haskell study 7
Haskell study 7
ย 
Haskell study 6
Haskell study 6Haskell study 6
Haskell study 6
ย 
Haskell study 5
Haskell study 5Haskell study 5
Haskell study 5
ย 
Haskell study 4
Haskell study 4Haskell study 4
Haskell study 4
ย 
Haskell study 3
Haskell study 3Haskell study 3
Haskell study 3
ย 
Haskell study 2
Haskell study 2Haskell study 2
Haskell study 2
ย 
Haskell study 1
Haskell study 1Haskell study 1
Haskell study 1
ย 
Haskell study 0
Haskell study 0Haskell study 0
Haskell study 0
ย 
Multi thread
Multi threadMulti thread
Multi thread
ย 
Database
DatabaseDatabase
Database
ย 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
ย 

Exception&log

  • 1. Exception & Log NHN NEXT ๋‚จํ˜„์šฑ
  • 3. 01 Exception โ€ข Structured Exception Handling(SEH) ํ”„๋กœ๊ทธ๋žจ์„ ์•„๋ฌด๋ฆฌ ์ž˜ ๋งŒ๋“ค์–ด๋„ ์˜ˆ์™ธ ์ƒํ™ฉ(Exception)์€ ํ”ผํ•  ์ˆ˜ ์—†๋‹ค. ์˜ˆ์™ธ๋Š” ํ”„๋กœ๊ทธ๋žจ ์™ธ๋ถ€ ์˜ ๋ถˆ๊ฐ€ํ•ญ๋ ฅ์ ์ธ ์ƒํ™ฉ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(์กด์žฌํ•ด์•ผ ํ•  ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š ๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋ฐ›์•„์•ผํ•˜๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜, ๊ธฐํƒ€ ๋“ฑ๋“ฑ). ์ด๋Ÿฐ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜ ๊ธฐ ์œ„ํ•ด ์œˆ๋„์šฐ์ฆˆ์—์„œ๋Š” SEH๋ฅผ ์ด์šฉํ•œ๋‹ค. SEH๋ฅผ ์ด์šฉํ•˜๋ฉด ์‹คํ–‰ ์ฝ”๋“œ์™€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌ ์‹œ์ผœ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ, ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๊ตฌ์กฐ๋‚˜ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ C++ try catch ๊ตฌ๋ฌธ๊ณผ ๊ฑฐ์˜ ๋˜‘๊ฐ™๋‹ค. __try : ์‹คํ–‰ ์ฝ”๋“œ ๋ธ”๋Ÿญ __except ( exception filter ) : ์˜ˆ์™ธ ์ƒํ™ฉ ๋ฐœ์ƒ์‹œ ์˜ˆ์™ธ์— ๋”ฐ๋ผ ์‹คํ–‰.
  • 4. 01 Exception โ€ข Exception Filter SEH์—์„œ __except๋Š” ์ธ์ž๋กœ exception filter๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ด ํ•„ํ„ฐ๋Š” ์˜ˆ์™ธ๋ฅผ ๋ˆ„๊ฐ€ ์ฒ˜๋ฆฌํ• ์ง€, ์˜ˆ ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋‹ค์Œ์— ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€ ๋“ฑ๋“ฑ์„ ์ง€์ •ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค. exception filter์—๋Š” ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ๊ฐ’์€ excpt.h ํŒŒ์ผ์— ์ •์˜๋˜์–ด ์žˆ์Œ. โ€ข EXCEPTION_EXECUTE_HANDLER โ€ข EXCEPTION_CONTINUE_EXECUTION โ€ข EXCEPTION_CONTINUE_SEARCH
  • 5. 01 Exception โ€ข Exception Filter EXCEPTION_EXECUTE_HANDLER ์ด ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ๋  ๊ฒฝ์šฐ, __try ๋ธ”๋ก์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ ์— ๊ทธ ์ดํ›„ __try ์ฝ”๋“œ ๋ธ”๋ก์˜ ์‹คํ–‰์„ ๋ชจ๋‘ ์ƒ๋žตํ•˜๊ณ  global unwind๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ __except๋ธ”๋ก์˜ ์ฝ”๋“œ ๋ฐ ๊ทธ ์ดํ›„ ์ฝ”๋“œ๋“ค์„ ์ˆ˜ํ–‰ํ•˜ ๊ฒŒ ๋œ๋‹ค. int main() { int a = 0, b = 0; __try { b = 5 / a; //divide by 0 printf("ignore."); } __except(EXCEPTION_EXECUTE_HANDLER) { printf("execption."); } printf("after exception."); } //์‹คํ–‰์‹œ execption. after exception. ์ถœ๋ ฅ
  • 6. 01 Exception โ€ข Exception Filter EXCEPTION_CONTINUE_EXECUTION ์ด ๊ฑด ์œ„ ํ•„ํ„ฐ์™€ ์ • ๋ฐ˜๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ด ํ•„ํ„ฐ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ __try ๋ธ”๋ก์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ ํ–ˆ๋˜ ์ฝ”๋“œ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฆ‰ ์ด ํ•„ํ„ฐ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ๋ฐ˜๋ณต ์‹œํ–‰์—์„œ ๋ญ”๊ฐ€ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์›์ธ๋„ ๋ชจ๋ฅธ ์ฑ„ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ๊ฑฐ๋‚˜ ํ•  ์ˆ˜ ์žˆ๋‹ค. int main() { int a = 0, b = 0; //divide by 0 __try{ b = 5/a; } __except(ExceptHandle(&a)) {} } int ExceptHandle(int* divider) { scanf("%d",&divider); return divider ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_EXECUTION; } ์‹คํ–‰์‹œ 0์œผ๋กœ ๋‚˜๋ˆˆ ๊ฒƒ์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒ -> 0 ์•„๋‹Œ ์ˆ˜ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต ์‹คํ–‰ -> 0 ์•„๋‹Œ ์ˆ˜ ๋‚˜์˜ค๋ฉด __except ์•ˆ์˜ ์ฝ”๋“œ ์‹คํ–‰ ํ›„ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ์ง„ํ–‰.
  • 7. 01 Exception โ€ข Exception Filter EXCEPTION_CONTINUE_SEARCH ์ด ํ•„ํ„ฐ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ํ˜„์žฌ ์ง€์ •๋œ __except์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ฝœ์Šคํƒ์„ ๊ฑฐ๊พธ๋กœ ๋˜์ฐพ์•„๊ฐ€๋ฉด์„œ ๋‹ค๋ฅธ __except ๋ธ”๋ก์— ์ฒ˜๋ฆฌ๋ฅผ ๋„˜๊ธด๋‹ค(๊ฑฐ๊ธฐ์„œ๋„ EXCEPTION_CONTIN- UE_SEARCH๋ผ๋ฉด ๋‹ค์‹œ ๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ๋จผ์ € ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์ชฝ์œผ๋กœ ์ญ‰ ์ง„ํ–‰). ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์•„๋ฌด๋Ÿฐ ํ•ธ๋“ค๋Ÿฌ ๋„ ์ฐพ์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์ข…๋ฃŒ๋œ๋‹ค. void foo() { int a = 0, b = 0; __try { b = 5 / a; // divide by 0 } __except (EXCEPTION_CONTINUE_SEARCH) { printf("ignore."); } } int main() { __try { foo(); } __except (EXCEPTION_EXECUTE_HANDLER) { printf("exception."); } } ์‹คํ–‰์‹œ exception. ์ถœ๋ ฅ๋จ.
  • 8. 01 Exception โ€ข Unhandled Exception ์•ž์„  ํ•„ํ„ฐ๋“ค์„ ํ†ตํ•ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ SEH๋ฅผ ํ†ตํ•ด ์–ด๋–ค์‹์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฐ ์˜ˆ์™ธ ์ค‘์—์„œ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํŠน์ • ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๊นŒ์ „์— EXCEPTION_CONTINUE_SEARCH ํ•„ํ„ฐ๋ฅผ ์„ค์ •ํ–ˆ์„ ๊ฒฝ์šฐ ๋๊นŒ์ง€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ๊ทธ๋ƒฅ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ์–ด๋ฒ„๋ฆฌ๋Š”๋ฐ, ์ด๋Ÿฐ ์ƒํ™ฉ์— Unhandled Exception filter๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ”„๋กœ๊ทธ๋žจ์˜ dump๋ฅผ ๋œฌ ๋‹ค์Œ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ์‹œํ‚ค๊ฑฐ๋‚˜ ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ์„ค์ •์€ windows์˜ SetUnhandledExceptionFilter ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค. LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter( _In_ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter ); LPTOP_LVEL_EXCEPTION_FILTER๋Š” LPEXCEPTION_POINTERS๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ  LONG์„ ๋ฆฌํ„ดํ•˜๋Š” WINAPI ํ˜ธ์ถœ ๊ทœ์•ฝ์˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์ด๋‹ค. ( LONG WINAPI filter(LPEXCEPTION_POINTERS * info); )
  • 9. 01 Exception โ€ข Dump ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ์„ ๋•Œ ๋คํ”„ ์ •๋ณด๋ฅผ ๋‚จ๊ธฐ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?๋คํ”„ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ์ด ํ•จ์ˆ˜๋ฅผ SetUnhandledExceptionFilter ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋“ฑ๋กํ•˜๋ฉด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์ž๋™์œผ๋กœ ๋คํ”„ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค„ ๊ฒƒ์ด๋‹ค. ๋คํ”„๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด MiniDumpWriteDump ํ•จ์ˆ˜๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค. BOOL WINAPI MiniDumpWriteDump( _In_ HANDLE hProcess, // ๋คํ”„ ๋œฐ ํ”„๋กœ์„ธ์Šค ํ•ธ๋“ค _In_ DWORD ProcessId, // ๋คํ”„ ๋œฐ ํ”„๋กœ์„ธ์Šค ์•„์ด๋”” _In_ HANDLE hFile, // ๋คํ”„ ๊ธฐ๋กํ•  ํŒŒ์ผ ํ•ธ๋“ค _In_ MINIDUMP_TYPE DumpType, // ๊ธฐ๋กํ•  ๋คํ”„์˜ ํƒ€์ž…(ํ›„์ˆ ) //๋คํ”„ ๋œฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋งŒ๋“  ์˜ˆ์™ธ ์ •๋ณด(NULL์ด๋ฉด ๊ธฐ๋ก๋˜์ง€ ์•Š์Œ) _In_ PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, //๋คํ”„ ํŒŒ์ผ์— ๊ธฐ๋กํ•  ์‚ฌ์šฉ์ž ์ •์˜ ์ •๋ณด(NULL์ด๋ฉด ๊ธฐ๋ก๋˜์ง€ ์•Š์Œ) _In_ PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, //ํ™•์žฅ๋œ ๋ฏธ๋‹ˆ ๋คํ”„ ์ •๋ณด๋ฅผ ๋ฐ›์„ ์ฝœ๋ฐฑ ๋ฃจํ‹ด(NULL์ด๋ฉด ์•„๋ฌด ์ฝœ๋ฐฑ๋„ ํ˜ธ์ถœ ์•ˆ ๋จ) _In_ PMINIDUMP_CALLBACK_INFORMATION CallbackParam );
  • 10. 01 Exception โ€ข Dump ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ MiniDump์˜ ํƒ€์ž…์—๋Š” ๊ต‰์žฅํžˆ ๋งŽ์€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ์ „์ฒด ๋ชฉ๋ก ๋ฐ ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด MSDN์˜ MINIDUMP_TYPE ๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ๋œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ 2๊ฐ€์ง€๋Š” MiniDumpNormal๊ณผ MiniDumpWithFullMemory์ด๋‹ค. MiniDumpNormal์€ ๋กœ์ปฌ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ํฌํ•จํ•ด์„œ ๋คํ”„๋ฅผ ๋œจ๊ณ , MiniDumpWithFullMemory๋Š” ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์„ ํฌํ•จํ•˜์—ฌ ๋คํ”„๋ฅผ ๋œฌ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์ œ MINIDUMP_EXCEPTION_INFORMATION exceptionInfo; exceptionInfo.ThreadId = GetCurrentThreadId(); exceptionInfo.ExceptionPointers = e; exceptionInfo.ClientPointers = FALSE; HANDLE hProcess = GetCurrentProcess(); DWORD dwProcessID = GetCurrentProcessId(); DWORD dwThreadID = GetCurrentThreadId(); MiniDumpWriteDump(hProcess, dwProcessId, hFile, MiniDumpWithFullMemory, &exceptionInfo, NULL, NULL);
  • 11. 01 Exception โ€ข StackWalk64 ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด StackWalk64 ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค. ์ธ์ž๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ๊ณ  ๋ณต์žกํ•˜๋‹ค. BOOL WINAPI StackWalk64( _In_ DWORD MachineType, _In_ HANDLE hProcess, _In_ HANDLE hThread, _Inout_ LPSTACKFRAME64 StackFrame, _Inout_ PVOID ContextRecord, _In_opt_ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, _In_opt_ PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, _In_opt_ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, _In_opt_ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress );
  • 12. 01 Exception โ€ข StackWalk64 MachineType ์ƒ์„ฑํ•  ์Šคํƒ ์ถ”์  ์ •๋ณด์˜ ์ปดํ“จํ„ฐ ์•„ํ‚คํ…์ณ ์ข…๋ฅ˜์ด๋‹ค. ์•„๋ž˜ 3๊ฐ€์ง€ ๊ฐ’์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ง„๋‹ค. โ€ข IMAGE_FILE_MACHINE_I386 Intel x86 ์•„ํ‚คํ…์ณ โ€ข IMAGE_FILE_MACHINE_IA64 Intel Itanium ์•„ํ‚คํ…์ณ โ€ข IMAGE_FILE_MACHINE_AMD64 x64(AMD64 or EM64T) ์•„ํ‚คํ…์ณ hProcess, hThread ์Šคํƒ์„ ์ถ”์ ํ•  ํ”„๋กœ์„ธ์Šค ๋ฐ ์Šค๋ ˆ๋“œ ํ•ธ๋“ค. StackFrame STACKFRAME64 ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ. StackWalk64 ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉด ์ด ํฌ์ธํ„ฐ์— ๋‹ค์Œ ์Šคํƒ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.
  • 13. 01 Exception โ€ข StackWalk64 ContextRecord CONTEXT ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ. MachineType ์ธ์ž๊ฐ€ IMAGE_FILE_MACHINE_I386 ์ด ์•„๋‹ ๋•Œ๋งŒ ํ•„์š”ํ•˜๋‹ค(ํ•ด๋‹น MachineType์ด ์•„๋‹ˆ๋ผ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ context record ๊ฐ’์„ ๋„˜๊ธฐ๋Š”๊ฒŒ ๊ถŒ์žฅ๋œ๋‹ค๊ณ  ํ•จ). ์ด ์ธ์ž๋กœ ๋„˜์–ด๊ฐ„ ContextRecord ๊ฐ’์€ ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋‹ค. RtlCaptureContext ํ•จ์ˆ˜๋กœ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ReadMemoryRoutine ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์–ด์˜ค๋Š” ๋ฐ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’ (ReadProcessMemoryPros64)๋กœ ์ง€์ •๋จ. FunctionTableAccessRoutine (optional) ํ”„๋กœ์„ธ์Šค์˜ run time function table์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ง€์ •. SymFunctionTableAccess64 ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณดํ†ต ์“ด๋‹ค๊ณ  ํ•œ๋‹ค
  • 14. 01 Exception โ€ข StackWalk64 GetModuleBaseRoutine(optional) ์ฃผ์–ด์ง„ ๊ฐ€์ƒํ•จ์ˆ˜์— ๋Œ€ํ•œ module base๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜. ๋ณดํ†ต SymGetModuleBase64 ํ•จ์ˆ˜๋ฅผ ์“ด๋‹ค๊ณ  ํ•จ. TranslateAddress(optional) 16๋น„ํŠธ ์ฃผ์†Œ์— ๋Œ€ํ•œ ๋ณ€ํ™˜์„ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜. ํ•„์š”์—†์œผ๋ฉด NULL์„ ๋„˜๊ธด๋‹ค.
  • 15. 01 Exception โ€ข StackWalk64 ์‚ฌ์šฉ ์˜ˆ์ œ StackWalk64๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ณ€์ˆ˜๋“ค BOOL res; HANDLE hProcess; HANDLE hThread; CONTEXT context = {0, }; STACKFRAME64 stack = {0, }; ULONG frame; const int MaxNameLen = 255; SYMBOL_INFO* symbol = (SYMBOL_INFO*)malloc(sizeof(SYMBOL_INFO) + MaxNameLen); DWORD64 displacement64 = 0; DWORD displacement = 0; IMAGEHLP_LINE64 imageHelpLine; DWORD dwSymOptions = SymGetOptions();
  • 16. 01 Exception โ€ข StackWalk64 ์‚ฌ์šฉ ์˜ˆ์ œ Symbol Option ์ดˆ๊ธฐํ™” dwSymOptions |= SYMOPT_LOAD_LINES; dwSymOptions |= SYMOPT_UNDNAME; dwSymOptions |= SYMOPT_EXACT_SYMBOLS; SymSetOptions(dwSymOptions); memset(symbol, 0, sizeof(SYMBOL_INFO) + MaxNameLen); symbol->SizeOfStruct = sizeof(SYMBOL_INFO); symbol->MaxNameLen = MaxNameLen; memset(&imageHelpLine, 0, sizeof(imageHelpLine)); imageHelpLine.SizeOfStruct = sizeof(imageHelpLine); SymInitialize(GetCurrentProcess(), ".", 1);
  • 17. 01 Exception โ€ข StackWalk64 ์‚ฌ์šฉ ์˜ˆ์ œ stack ๊ตฌ์กฐ์ฒด ์ดˆ๊ธฐํ™” ๋ฐ context ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ RtlCaptureContext(&context); memset(&stack, 0, sizeof(STACKFRAME64)); hProcess = GetCurrentProcess(); hThread = GetCurrentThread(); stack.AddrPC.Offset = context.Eip; stack.AddrPC.Mode = AddrModeFlat; stack.AddrStack.Offset = context.Esp; stack.AddrStack.Mode = AddrModeFlat; stack.AddrFrame.Offset = context.Ebp; stack.AddrFrame.Mode = AddrModeFlat; stack.AddrBStore.Mode = AddrModeFlat; stack.AddrReturn.Mode = AddrModeFlat;
  • 18. 01 Exception โ€ข StackWalk64 ์‚ฌ์šฉ ์˜ˆ์ œ ์Šคํƒ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ for (frame = 0;; frame++) { res = StackWalk64 ( IMAGE_FILE_MACHINE_I386, hProcess, hThread, &stack, &context, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL );
  • 19. 01 Exception โ€ข StackWalk64 ์‚ฌ์šฉ ์˜ˆ์ œ ์‹ฌ๋ณผ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์ถœ๋ ฅ SymFromAddr(hProcess, stack.AddrPC.Offset, &displacement64, symbol); SymGetLineFromAddr64(hProcess, stack.AddrPC.Offset, &displacement, &imageHelpLine); printf ( "Frame %lu:nSymbol name: %snFile Name : %sn" "Line Number : %dnPC address: 0x%08LXn" "Frame address: 0x%08LXn", frame, symbol->Name, imageHelpLine.FileName, imageHelpLine.LineNumber, (ULONG64)stack.AddrPC.Offset, (ULONG64)stack.AddrStack.Offset, (ULONG64)stack.AddrFrame.Offset );
  • 22. 02 Log โ€ข C++ Log Library C++์—๋Š” ์ด๋ฏธ ์ž˜ ๋งŒ๋“ค์–ด์ง„ ๋กœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋งŽ๋‹ค. ๊ทธ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋งŒ ์‚ดํŽด๋ณด์ž. glog ๊ตฌ๊ธ€์—์„œ ๋งŒ๋“  C++ ๋กœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ค€์˜ ๋กœ๊น…์„ ๊ตฌํ˜„. ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ๋งŒ ๋กœ ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ, ํŠน์ • ์ƒํƒœ์—์„œ๋งŒ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ธฐ๋Šฅ ๋“ฑ๋“ฑ์„ ์ง€์›ํ•œ๋‹ค. ์‚ฌ์šฉ๋ฒ• ๊ด€๋ จ ๋งํฌ : http://jjalidev.blogspot.kr/2013/10/glog.html log4Cxx log4j๋ฅผ ๋ณธ๋”ฐ C++ ๋ฒ„์ ผ์œผ๋กœ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ๋น ๋ฅด๊ณ  ํ™•์žฅ์„ฑ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค. ํ‰๊ฐ€๊ฐ€ ์ข‹์€ ํŽธ์ด ์ง€๋งŒ 2008๋…„ ์ดํ›„๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†๋‹ค. ์‚ฌ์šฉ๋ฒ• ๊ด€๋ จ ๋งํฌ : http://mindgear.tistory.com/184
  • 23. 02 Log โ€ข Boost::log C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ค‘ ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๊ณ  ๋งŽ์ด ์“ฐ์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ log ๊ธฐ๋Šฅ์„ ํ•œ ๋ฒˆ ์จ๋ณด์ž. Boost ์„ค์น˜๋Š” ๋งํฌ ์ฐธ์กฐ. ๊ธ€์— ์ ํžŒ ๊ฑธ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. Simplicity, Extensibility, Performance๋ฅผ ๊ฐ€์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชฉํ‘œ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•จ. ๋ฉ”๋‰ด์–ผ ๋งํฌ
  • 24. 02 Log โ€ข Boost::log ๊ฐ„๋žตํ•œ ๊ตฌ์กฐ ์„ค๋ช…( ์•ž ์Šฌ๋ผ์ด๋“œ์˜ ๊ทธ๋ฆผ ์ฐธ์กฐ) Logging Sources logger๋Š” ์‹ค์ œ ๊ธฐ๋ก๋  ๋ฉ”์‹œ์ง€๋ฅผ ํ˜•์‹ํ™”(format)ํ•˜๊ธฐ ์œ„ํ•œ ์ŠคํŠธ๋ฆผ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ์˜ค๋ธŒ์ ํŠธ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋‹ค์–‘ํ•œ logger๋ฅผ ์ง€์›ํ•˜๋ฉฐ ์ง์ ‘ logger๋ฅผ ๋งŒ๋“ค์–ด ์“ฐ๊ฑฐ๋‚˜ ํ™•์žฅํ•ด ์“ธ ์ˆ˜ ์žˆ๋‹ค. Attributes and attribute values log source๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” log record์— ๊ด€๋ จ๋œ ๋ชจ๋“  ์ •๋ณด๋ฅผ logging core์— ๋„˜๊ฒจ์ฃผ ์–ด์•ผํ•œ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋“ค์€ attribute๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ์˜ attribute๋“ค์€ ๊ธฐ๋ณธ ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์ด๋‹ค. attribute set์—๋Š” global / thread-specific, source-specific์˜ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. Logging core and filtering attribute value ์ง‘ํ•ฉ์ด ๋ชจ๋‘ ๊ตฌ์„ฑ๋˜๋ฉด, logging core๋Š” ํ•ด๋‹น log record๊ฐ€ ๊ธฐ๋ก๋˜์–ด์•ผ ํ•˜๋Š” log์ธ์ง€ ํŒ๋‹จํ•˜๊ณ  ํ•„์š”์—†์œผ๋ฉด ๋ฒ„๋ฆฐ๋‹ค(filtering). Sinks and formatting ํ•„ํ„ฐ๋ง์„ ํ†ต๊ณผํ•˜๋ฉด ํ•ด๋‹น record๋ฅผ ์ ์ ˆํžˆ ํ˜•์‹ํ™”ํ•ด์„œ ํ•ด๋‹น record๊ฐ€ ๊ธฐ๋ก๋˜์–ด์•ผ ํ•  sink๋กœ ๋ณด ๋‚ธ๋‹ค. front-end / back-end๋กœ ๊ตฌ์„ฑ.
  • 25. 02 Log โ€ข Boost::log Trivial logging ์ œ์ผ ๊ฐ„๋‹จํ•œ ๋กœ๊น…. ๊ทธ๋ƒฅ ํ•ด๋‹น ๋ฉ”์‹œ์ง€ ์ฝ˜์†” ์ฐฝ์— ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค(std::cout). #include <boost/log/trivial.hpp> int main() { BOOST_LOG_TRIVIAL(trace) << "A trace severity message"; BOOST_LOG_TRIVIAL(debug) << "A debug severity message"; BOOST_LOG_TRIVIAL(info) << "An informational severity message"; BOOST_LOG_TRIVIAL(warning) << "A warning severity message"; BOOST_LOG_TRIVIAL(error) << "An error severity message"; BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message"; return 0; }
  • 26. 02 Log โ€ข Boost::log Setup Sink log๊ฐ€ ์ถœ๋ ฅ๋  sink๋ฅผ ์ง์ ‘ ์„ค์ •ํ•ด์„œ ์“ฐ๊ธฐ. namespace logging = boost::log; namespace src = boost::log::sources; namespace sinks = boost::log::sinks; namespace keywords = boost::log::keywords; int main() { using namespace logging::trivial; logging::add_file_log ( keywords::file_name = "sample_%N.log", keywords::rotation_size = 10 * 1024 * 1024, keywords::format = "[%TimeStamp%] : %Message%" ); logging::core::get()->set_filter ( severity >= info ); logging::add_common_attributes(); src::severity_logger<severity_level> lg; BOOST_LOG_SEV(lg, trace) << "A trace severity message"; BOOST_LOG_SEV(lg, debug) << "A debug severity message"; BOOST_LOG_SEV(lg, info) << "An informational severity message"; BOOST_LOG_SEV(lg, warning) << "A warning severity message"; BOOST_LOG_SEV(lg, error) << "An error severity message"; BOOST_LOG_SEV(lg, fatal) << "A fatal severity message"; return 0; } ์‚ฌ์šฉ๋ฒ•์ด ์ƒ๋‹นํžˆ ๋ฐฉ๋Œ€ํ•ด์„œ ์˜ˆ์ œ๋Š” ์ด์ •๋„๋กœ.. ๋ฉ”๋‰ด์–ผ ๋ฌธ์„œ์— ํŠœํ† ๋ฆฌ์–ผ์ด ๊ต‰์žฅํžˆ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์œผ๋‹ˆ ๊ทธ๊ฑธ ์ฐธ๊ณ ํ•˜์ž!
  • 27. 02 Log โ€ข ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์—์„œ์˜ ๋กœ๊ทธ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์—์„œ๋Š” ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ์—ญ์‹œ๋‚˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค. ์—ฌ๋Ÿฌ ์Šค ๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ด๋Ÿฐ ์ €๋Ÿฐ ๋‚ด์šฉ๋“ค์„ ๋กœ๊น…ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ˆœ์„œ๊ฐ€ ๊ผฌ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. boost ๊ฐ™ ์€ ๊ฒฝ์šฐ์—๋Š” sink์—์„œ frond-end์™€ back-end๋ฅผ ๋‚˜๋ˆˆ ๋’ค front-end์—์„œ ์Šค๋ ˆ๋“œ๊ฐ„ ๋™๊ธฐํ™” ๋“ฑ ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  back-end์—์„œ ์‹ค์ œ๋กœ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹์œผ๋กœ ์ด ๋Ÿฐ ์ˆœ์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค(์‹ค์ œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค). ๊ฐœ์ธ์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ์—๋Š” ์•„๋ž˜ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ •๋„๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. queue ์ด์šฉํ•˜๊ธฐ thread-safeํ•œ queue๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฑฐ๊ธฐ ๋กœ๊ทธํ•  ๋‚ด์šฉ์„ ์ง‘์–ด๋„ฃ์€ ๋’ค ๊บผ๋‚ด์„œ ์‹ค์ œ๋กœ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค. GCE ๊ฐ™์€ ๊ตฌ์กฐ ์ด์šฉํ•˜๊ธฐ ์ฝ”๋”ฉ ๊ณผ์ œ์— ์žˆ๋Š” GCE ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๋งŒ๋“ค๋ฉด lock ์•ˆ ๊ฑธ๊ณ  ์ˆœ์„œ ๋ณด์žฅํ•˜๋Š” log ๊ธฐ๋ก์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™ ๋‹ค.(GCE๋„ ๊ทธ๋Ÿฐ ์—ญํ• ์„ ํ•˜๋‹ˆ๊นŒ) log๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์• ๊ฐ€ ์•„๋ฌด๋„ ์—†์œผ๋ฉด ์ง์ ‘ ๊ธฐ๋กํ•˜๊ณ , ๋ˆ„๊ตฐ๊ฐ€ log ๋ฅผ ๊ธฐ๋ก ์ค‘์ด๋ผ๋ฉด ๊ฑ”ํ•œํ…Œ ์ž๊ธฐ๊ฐ€ ํ•ด์•ผํ•  log๊นŒ์ง€ ๋– ๋งก๊ธฐ๊ณ  ๊ทธ๋ƒฅ ์ž๊ธฐ ํ•  ์ผ ํ•˜๋Š” ๋ฐฉ์‹.