- Structured Exception Handling
- Termination Handling
- Exception Handling
- Stack Unwind
- Local Unwind
- Global Unwind
- Unhandled Exception
- First and Second Chance Exception
- Vectored Exception Handling
- ¸µÅ©
1 Structured Exception Handling
- À©µµ¿ìÁî¿¡¼ Á¦°øÇÏ´Â ¿¹¿Ü ó¸® ¹æ½ÄÀÌ´Ù. (»ç½Ç ½ÇÁ¦ ±¸ÇöÀº ÄÄÆÄÀÏ·¯¿¡¼ ÀÌ·ç¾îÁø´Ù.)
- C++ ¿¹¿Ü¿Í´Â ´Ù¸¥ °ÍÀÌ´Ù.
- À©µµ¿ìÁî »ó¿¡¼´Â C++ ½ºÅÄ´Ùµå ¶óÀ̺귯¸®µµ ³»ºÎÀûÀ¸·Î SEH¸¦ ÀÌ¿ëÇÑ´Ù.
- C++ ¿¹¿Ü 󸮴 ´ç¿¬È÷ C++¿¡¼¸¸ »ç¿ëÇÒ ¼ö ÀÖÀ¸³ª, SEH´Â ¾ð¾î Á߸³ÀûÀ̱⠶§¹®¿¡ ´Ù¸¥ ¾ð¾î¿¡¼µµ »ç¿ë °¡´ÉÇÏ´Ù.
- Termination Handling°ú Exception HandlingÀ¸·Î ºÐ·ùÇÒ ¼ö ÀÖ´Ù.
2 Termination Handling
__try
{
// Guarded code
}
__finally
{
// Termination handler
} finally ºí·Ï ¾ÈÀÇ ¾ÈÀÇ ÄÚµå´Â try ºí·Ï ¾È¿¡¼ ¹«½¼ ÁþÀ» ÇÏµç ¹Ýµå½Ã ½ÇÇàµÈ´Ù. try ºí·Ï ¾È¿¡¼ returnÀ» ÇØµµ, goto¸¦ ÇØµµ, longjump ¸í·ÉÀ» Á÷Á¢ È£ÃâÇØµµ, °á±¹Àº ½ÇÇàµÈ´Ù. Á» ´õ ÀÚ¼¼ÇÏ°Ô ¸»ÇÏÀÚ¸é, returnÀ̳ª goto¸¦ Çϱâ Á÷Àü¿¡ finally ºí·Ï ¾ÈÀÇ Äڵ尡 ½ÇÇàµÈ´Ù. (exit, abort, ExitProcess, TerminateThread µîÀ» ÅëÇØ ÇÁ·Î¼¼½º³ª ½º·¹µå°¡ Á¾·áµÇ´Â °æ¿ì´Â ¿¹¿Ü´Ù. ÀÌ·± °æ¿ì¿¡´Â finally ºí·ÏÀÇ Äڵ尡 ½ÇÇàµÇÁö ¾Ê´Â´Ù.)
try ºí·Ï ¾È¿¡¼ return, goto, longjump µîÀ» »ç¿ëÇÏ´Â °ÍÀº ÀÚÁ¦ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¹Ýȯ°ª ¹®Á¦ ¶§¹®¿¡ ÄÄÆÄÀÏ·¯°¡ Ãß°¡ÀûÀÎ Äڵ带 ¸¸µé¾î³»±â ¶§¹®ÀÌ´Ù. ÀÌ ÄÚµåÀÇ ¾çÀº CPU¸¶´Ù Ʋ·ÁÁö´Âµ¥, ¼ö¹é¿¡¼ ¼öõ »çÀÌŬ±îÁö °É¸®´Â °æ¿ì°¡ ÀÖ´Ù. ±×·¯¹Ç·Î ÀÚÁÖ »ç¿ëÇÏ´Â Äڵ忡´Ù°¡ Áý¾î³Ö¾î ³õÀ¸¸é ÇÁ·Î±×·¥ÀÇ ¼º´ÉÀÌ ½É°¢ÇÑ ¼öÁرîÁö ¶³¾îÁú ¿°·Á°¡ ÀÖ´Ù.
ÄÚµåÀÇ È帧ÀÌ ÀÚ¿¬½º·¹ finally ºí·Ï±îÁö Èê·¯°¡´Â °æ¿ì(return µîÀ» »ç¿ëÇÏÁö ¾Ê´Â °æ¿ì), ¿À¹öÇìµå´Â °ÅÀÇ ¾ø´Ù. x86 °è¿ÀÇ CPU¿¡¼ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇÑ °æ¿ì, ´Ü ÇϳªÀÇ ¸í·É¾î¸¦ ½ÇÇàÇÒ »ÓÀÌ´Ù.
ÀϹÝÀûÀ¸·Î °¡Àå ÁÁÀº ¹æ¹ýÀº try ºí·Ï ¾È¿¡¼ return, continue, break, goto ¹® µîÀ» ¾²Áö ¾Ê´Â °ÍÀÌ´Ù. À̵éÀº try ºí·Ï ¹Ù±ù ÂÊÀ¸·Î »©³»Áà¾ß ÇÑ´Ù. ±×·¡µµ ¾î¿ ¼ö ¾øÀÌ try ºí·ÏÀ» ºüÁ®³ª°¡°íÀÚ ÇÑ´Ù¸é __leave Ű¿öµå¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
bool some_function(const char* param)
{
bool bOK = false;
char* pBuffer = NULL;
...
__try
{
pBuffer = new char[100];
if (pBuffer == NULL)
{
// return false; // ¿©±â¼ false¸¦ ¸®ÅÏÇÒ °ÍÀÌ ¾Æ´Ï¶ó, __leave¸¦ »ç¿ëÇÑ´Ù.
__leave;
}
bOK = true;
}
__finally
{
if (pBuffer) delete [] pBuffer;
}
...
return bOK;
} __leave Ű¿öµå¸¦ »ç¿ëÇϸé, ÄÚµåÀÇ È帧(instruction pointer)ÀÌ try ºí·ÏÀÌ ³¡³ª´Â °÷(__finally ¹Ù·Î ¾ÕÀÇ °ýÈ£)À¸·Î À̵¿ÇÑ´Ù. ±× ´ÙÀ½ finally ºí·Ï ¾ÈÀÇ Äڵ尡 ÀÚ¿¬½º·¹ ½ÇÇàµÈ´Ù. À§¿¡¼µµ ¾ð±ÞÇßµíÀÌ ÀÚ¿¬½º·¯¿î À̵¿Àº ¼º´É¿¡ ¿µÇâÀ» °ÅÀÇ ÁÖÁö ¾Ê´Â´Ù.
3 Exception Handling
__try
{
// Guarded code
}
__except (EXCEPTION_EXECUTE_HANDLER) // Exception filter
{
// Exception handling code
} except ºÎºÐÀº C++ ¿¹¿Ü ó¸® ±¸¹®ÀÇ catch¿Í ºñ½ÁÇØ º¸ÀÌÁö¸¸, ´Ù¸£´Ù. C++ ¿¹¿Ü 󸮿¡¼´Â ÀÌ ºÎºÐ¿¡ ¿¹¿ÜÀÇ Á¾·ù ¹Û¿¡ µé¾î°¥ ¼ö ¾øÁö¸¸, SEH¿¡¼´Â exception filter¶ó°í ºÒ¸®´Â C ±¸¹®(expression)ÀÌ µé¾î°£´Ù. exception filter ±¸¹®Àº °è»êÀ» °ÅÄ£ ÈÄ, ÃÖÁ¾ÀûÀ¸·Î ¼¼ °¡Áö °ª ÁßÀÇ Çϳª°¡ µÇ¾î¾ß ÇÑ´Ù.
- EXCEPTION_CONTINUE_EXECUTION (-1)
¿¹¿Ü¸¦ ¹«½ÃÇϰí, ¿¹¿Ü°¡ ¹ß»ýÇÑ ÁöÁ¡¿¡¼ºÎÅÍ ÇÁ·Î±×·¥À» °è¼Ó ½ÇÇàÇÑ´Ù. ¿¹¸¦ µé¾î 10 / i ¿¡¼ i°¡ 0ÀÌ¶ó¼ ¿¹¿Ü°¡ ¹ß»ýÇÑ °æ¿ì, ¿¹¿Ü ó¸® ÇÊÅͰ¡ ÀÌ °ªÀ̶ó¸é, ´Ù½Ã 10 / iºÎÅÍ ½ÇÇàÇÑ´Ù´Â ¸»ÀÌ´Ù.
- EXCEPTION_CONTINUE_SEARCH (0)
except ºí·Ï ¾ÈÀÇ Äڵ带 ½ÇÇàÇÏÁö ¾Ê°í, »óÀ§¿¡ ÀÖ´Â ¿¹¿Ü ó¸® Çڵ鷯¿¡°Ô ¿¹¿Ü 󸮸¦ ³Ñ±ä´Ù.
- EXCEPTION_EXECUTE_HANDLER (1)
except ºí·Ï ¾ÈÀÇ Äڵ带 ½ÇÇàÇÑ ÈÄ, except ºí·Ï ¾Æ·¡ÀÇ Äڵ带 ½ÇÇàÇÑ´Ù.
ÀÌ ¼¼°¡Áö °ªÀ» ÀÌ¿ëÇØ¼ ¿¹¿Ü ó¸® Äڵ带 »ùÇ÷Π¸¸µé¾î º¸ÀÚ¸é ´ÙÀ½°ú °°´Ù.
- try ºí·Ï ¾È¿¡¼ ¿¹¿Ü°¡ ¹ß»ýÇÑ °æ¿ì, ±× ¿¹¿Ü°¡ ACCESS_VIOLATIONÀÏ °æ¿ì¿¡´Â, exception ºí·Ï ¾ÈÀÇ Äڵ带 ½ÇÇàÇϰí, ´Ù¸¥ ¿¹¿ÜÀÎ °æ¿ì¿¡´Â »óÀ§¿¡ ÀÖ´Â ¿¹¿Ü ó¸® Çڵ鷯¿¡°Ô ÅëÁ¦¸¦ ³Ñ±â´Â ÄÚµå. (GetExceptionCode ÇÔ¼ö´Â try ºí·Ï ¾È¿¡¼ ¹ß»ýÇÑ ¿¹¿ÜÀÇ Á¾·ù¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö´Ù. ÀÚ¼¼ÇÑ °ÍÀº MSDNÀ» Âü°íÇϵµ·Ï.)
__try
{
...
// compute something
}
__except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
cerr << "Access violation happened!" << endl;
} - try ºí·Ï ¾È¿¡¼ ¹ß»ýÇÑ ¿¹¿Ü¿¡ ´ëÇÑ Á¤º¸¸¦ °Ë»çÇÏ´Â ÇÊÅÍ ÇÔ¼ö¸¦ ¸¸µç ÈÄ, À̸¦ exception filter ºÎºÐ¿¡¼ ½ÇÇàÇØ¼ ¾î¶² ÇൿÀ» ÇØ¾ßÇÒ Áö¸¦ ÆÇ´ÜÇÏ´Â ÄÚµå. (GetExceptionInformation ÇÔ¼ö´Â ¿¹¿Ü¿Í ¿¹¿Ü°¡ ¹ß»ýÇÑ ½ÃÁ¡¿¡¼ÀÇ ½Ã½ºÅÛ¿¡ ´ëÇÑ Á¤º¸¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö´Ù. ÀÚ¼¼ÇÑ °ÍÀº MSDNÀ» Âü°íÇϵµ·Ï.)
DWORD decide_what_to_do(PEXCEPTION_POINTERS pExceptions)
{
// check exceptions
...
return EXCEPTION_CONTINUE_EXECUTION;
}
__try
{
...
// compute something
}
__except(decide_what_to_do(GetExceptionInformation()))
{
...
} Exception HandlingÀÇ °æ¿ì, Termination Handling°ú´Â ´Þ¸®, try ºí·Ï ¾È¿¡ return, goto µîÀÌ À־ ÄÚµå Å©±â³ª ¼º´É¿¡ Æä³ÎƼ°¡ ¾ø´Ù.
4 Stack Unwind
4.1 Local Unwind
try-finally ±¸¹®¿¡¼ try ºí·Ï ³»ºÎ¿¡ return, goto µîÀÇ premature exit°¡ ÀÖÀ» °æ¿ì ¹ß»ýÇÑ´Ù. finally ºí·Ï ½ÇÇà ÈÄ, °ªÀ» ¸®ÅÏÇØ¾ßÇϱ⠶§¹®¿¡, ÄÄÆÄÀÏ·¯´Â Àӽà º¯¼ö¸¦ »ý¼ºÇؼ, ¸®ÅϰªÀ» ÀúÀåÇÑ ÈÄ, finally ºí·ÏÀ» ½ÇÇàÇϰí, ÀúÀåÇØµÐ °ªÀ» ¸®ÅÏÇÑ´Ù. À§¿¡¼µµ ³ª¿ÍÀÖµíÀÌ ÀÌ·± Äڵ尡 ²Ï ºñ¿ëÀÌ Å©±â ¶§¹®¿¡ ±Ø±¸ ÇÇÇØ¾ßÇÑ´Ù.
4.2 Global Unwind
Global unwind´Â try-except ±¸¹®¿¡¼ exception filter°¡ EXCEPTION_EXECUTE_HANDLER °ªÀÎ °æ¿ì ¹ß»ýÇÑ´Ù. µ¿ÀÛÀ» ¿ä¾àÇÏÀÚ¸é, EXCEPTION_EXECUTE_HANDLER·Î ÆÇÁ¤µÈ try ºí·Ï ¾ÈÀÇ ¸ðµç finally ºí·ÏÀ» Á¦ÀÏ ¾ÈÂÊÀÇ °ÍºÎÅÍ ½ÇÇàÇÑ ´ÙÀ½, ¿ø·¡ try ºí·ÏÀÇ except ºí·Ï ºÎºÐÀ» ½ÇÇàÇÑ´Ù°¡ µÇ°Ú´Ù.
´ÙÀ½Àº Programming Applications from Microsoft Windows¿¡¼ °¡Á®¿Â ¿¹Á¦ÀÌ´Ù. ÁüÀÛÇϵíÀÌ ÁÖ¼®¿¡ ÀÖ´Â ¹øÈ£´Â ½ÇÇà ¼ø¼¸¦ ³ªÅ¸³½´Ù.
void function1()
{
// 1. ¿©±â¼ ¹º°¡¸¦ ó¸®
...
__try
{
// 2. ´Ù¸¥ ÇÔ¼ö¸¦ È£Ãâ
function2();
// ÀÌ ºÎºÐÀÇ ÄÚµå´Â ½ÇÇàµÇÁö ¾Ê´Â´Ù.
...
}
__except ( /* 6. ÇÊÅÍ ±¸¹®À» °Ë»ç */ EXCEPTION_EXECUTE_HANDLER)
{
// 8. Unwind°¡ ÀÏ¾î³ ÈÄ¿¡, ¿¹¿Ü ó¸® Çڵ鷯°¡ ½ÇÇàµÈ´Ù.
MessageBox(...);
}
}
void function2()
{
// 3. ¿©±â¼ ¹º°¡¸¦ ó¸®
...
__try
{
// 4. ¹º°¡¿¡´Ù ¶ôÀ» °Ç´Ù.
EnterCriticalSection(&C);
// 5. ¿©±â¼ ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù.
int some = 10 / 0;
}
__finally
{
// 7. »óÀ§ ÇÔ¼öÀÇ exception filter ºÎºÐÀÇ °ªÀÌ
// EXCEPTION_EXECUTE_HANDLERÀ̱⠶§¹®¿¡ Global unwind°¡ ÀϾÙ.
// ¶ôÀ» Ǭ´Ù.
LeaveCriticalSection(&C);
}
// ÀÌ ºÎºÐÀÇ ÄÚµå´Â ½ÇÇàµÇÁö ¾Ê´Â´Ù.
} ¿Ö ½ÇÁ¦·Î ¿¹¿Ü°¡ ¹ß»ýÇÑ finally ºÎºÐÀÌ ¸ÕÀú ½ÇÇàµÇÁö ¾Ê´À³Ä°í ÇÒ ¼ö Àִµ¥, ¿¹¿Ü°¡ ¹ß»ýÇÑ °æ¿ì, finally º¸´Ù´Â except¸¦ ¸ÕÀú ã¾Æ¼ ó¸®ÇÑ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù. ¿Ö ±×·±Áö´Â ¾ÆÁ÷±îÁö Àß ÀÌÇØ°¡ °¡Áö ¾Ê´Â´Ù. ¾î·µç Áß¿äÇÑ °ÍÀº finally ºÎºÐÀº ¹Ýµå½Ã ½ÇÇàÀÌ µÈ´Ù´Â Á¡ÀÌ´Ù.
5 Unhandled Exception
¿¹¿Ü°¡ ¹ß»ýÇØ¼ ±×°É ó¸®ÇÏ´Â try-except ºÎºÐÀ» Â÷·Ê´ë·Î °Ë»çÇߴµ¥, ¸ðµÎ°¡ EXCEPTION_CONTINUE_SEARCH¸¦ ¹ÝȯÇÑ °æ¿ì¸¦ Unhandled ExceptionÀ̶ó°í ÇÑ´Ù. Áï ÇØ´çÇÏ´Â ¿¹¿Ü¸¦ ó¸®ÇÒ Çڵ鷯°¡ Çϳªµµ ¾ø´Ù´Â ¸»ÀÌ´Ù.
À©µµ¿ìÁî »ó¿¡¼ ¸ðµç ½º·¹µå´Â Kernal32.dll¿¡ ÀÖ´Â BaseProcessStart¿Í BaseThreadStart ÇÔ¼ö¸¦ ÅëÇØ ½ÇÇàµÈ´Ù. ù¹øÂ°´Â ÇÁ·Î¼¼½ºÀÇ ¸ÞÀÎ ½º·¹µå¸¦ À§ÇÑ °ÍÀ̰í, µÎ¹øÂ°´Â Ãß°¡ÀûÀÎ ½º·¹µå¸¦ À§ÇÑ °ÍÀÌÁö¸¸, °á±¹ ¶È°°Àº ³ÑÀÌ´Ù.
VOID BaseProcessStart(PPROCESS_START_ROUTINE pfnStartAddr)
{
__try {
ExitThread((pfnStartAddr)());
}
__except(UnhandledExceptionFilter(GetExceptionInformation())) {
ExitProcess(GetExceptionCode());
}
}
VOID BaseThreadStart(PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam)
{
__try {
ExitThread((pfnStartAddr)(pvParam));
}
__except(UnhandledExceptionFilter(GetExceptionInformation())) {
ExitProcess(GetExceptionCode());
}
} °á±¹ Unhandled ExceptionÀÌ ¹ß»ýÇÑ °æ¿ì, ½Ã½ºÅÛ¿¡¼ À̸¦ Àâ¾Æ¼ UnhandledExceptionFilter ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â »ç¿ëÀڵ鿡°Ô Ä£¼÷ÇÑ ´ÙÀ½ ´ëÈâÀ» Ç¥½ÃÇÑ´Ù.
¿©±â¼ "È®ÀÎ"À» ´©¸£°Ô µÇ¸é EXCEPTION_EXECUTE_HANDLER¸¦ ¹ÝȯÇϰí, global unwind¸¦ ÀÏÀ¸ÄÑ, °á±¹ ExitProcess¸¦ È£ÃâÇÏ°Ô ÇÑ´Ù. À̰ÍÀÌ È®ÀÎÀ» ´©¸£¸é ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ´Â ÀÌÀ¯´Ù. "Ãë¼Ò"¸¦ ´©¸¥ °æ¿ì, ½Ã½ºÅÛÀº JIT(Just In Time) µð¹ö°Å¸¦ ·ÎµåÇÏ°Ô µÈ´Ù.
¸ðµç ½º·¹µåÀÇ ÁÖ ·çÇÁ¸¦ ¼Õ¼ö ¸¸µç try-except (EXCEPTION_EXECUTE_HANDLER) ±¸¹®À¸·Î °¨½Î¸é, ¿¹¿Ü°¡ À§ÀÇ ÇÔ¼ö±îÁö °¡Áö ¾Ê°Ô µÈ´Ù. ÀÌ´Â À§ÀÇ ´ëÈâÀ» Ç¥½ÃÇÏÁö ¾Ê°í, ´Ù¸¥ ÇൿÀ» ÇÒ ¼ö ÀÖ´Ù´Â ¸»ÀÌ´Ù. ±×·¯³ª ¸ðµç ½º·¹µå¸¦ ÀÌ·± ½ÄÀ¸·Î °¨½Î´Â °Íº¸´Ù´Â SetUnhandledExceptionFilter ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ ³´´Ù.
LPTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
);
// TOP_LEVEL_EXCEPTION_FILTER ÇÔ¼öÀÇ Çü½Ä
LONG UnhandledExceptionFilter(
STRUCT _EXCEPTION_POINTERS* ExceptionInfo
); ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¿¹´Â MiniDump ÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.
6 First and Second Chance Exception
¿¹¿Ü Çڵ鷯¸¦ ¼³Ä¡ÇÑ °æ¿ì, ¿¹¿Ü°¡ ¹ß»ýÇϸé Çڵ鷯¿¡¼ ±×°ÍÀ» Àâ¾Æ¼ ó¸®ÇÑ ÈÄ, ½ÇÇàÀ» °è¼ÓÇÑ´Ù´Â °³³äÀº ¿¹¿Ü ó¸®ÀÇ ±âº»ÀÌ´Ù. ±×·±µ¥ ½ÇÇà ÁßÀÎ ÇÁ·Î±×·¥¿¡ µð¹ö°Å°¡ ºÙ¾îÀÖ´Â °æ¿ì¿¡´Â ¾à°£ ´Ù¸£´Ù. µð¹ö°Å°¡ ºÙ¾îÀÖ´Â »óÅ¿¡¼ÀÇ ¿¹¿Ü 󸮴 ´ÙÀ½°ú °°Àº ¼ø¼·Î ÀÌ·ç¾îÁø´Ù.
- µð¹ö°Å¿¡¼ ù¹øÂ°·Î ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù. --> First Chance Exception
- ÇÁ·Î±×·¥ ³»ºÎÀÇ ¿¹¿Ü Çڵ鷯¿¡¼ ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù.
- µð¹ö°Å¿¡¼ µÎ¹øÂ°·Î ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù. --> Second Chance Exception
¹°·Ð ù¹øÂ°·Î µð¹ö°Å¿¡¼ ¿¹¿Ü°¡ ¹ß»ýÇßÀ» ¶§, ÇÁ·Î±×·¥ ÂÊÀ¸·Î ¿¹¿Ü¸¦ ³Ñ°ÜÁÖÁö ¾ÊÀ¸¸é °Å±â¼ ³¡ÀÌ´Ù. ¶ÇÇÑ ÇÁ·Î±×·¥ ³»ºÎ¿¡¼ ¿¹¿Ü Çڵ鸵À» Á¦´ë·Î ÇÏÁö ¾ÊÀº °æ¿ì¿¡µµ ÇѹøÀ¸·Î ³¡ÀÌ´Ù. ÀÌ °æ¿ì´Â ¿ø·¡ ÇÁ·Î±×·¥ÀÌ Å©·¡½¬µÇ´Â »óȲÀ̶ó´Â °ÍÀº µÎ¸»ÇÒ ³ªÀ§ ¾ø´Ù. ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº
INFO: First and Second Chance Exception Handling¸¦ Âü°íÇϽöó.
7 Vectored Exception Handling
VEH´Â XP ÀÌ»óÀÇ À©µµ¿ìÁî¿¡¼ »ç¿ëÇÒ ¼ö ÀÖ´Â ¿¹¿Ü ó¸® ¹æ½ÄÀ¸·Î¼, __try/__catch ±¸¹® ´ë½Å¿¡ AddVectoredExceptionHandler, RemoveVectoredExceptionHandler ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ´Ù. VEH ÇÔ¼ö´Â ¿¹¿Ü°¡ ¹ß»ýÇÑ °æ¿ì, ½Ã½ºÅÛÀÌ SEH ÇÔ¼ö¸¦ ã±â À§ÇØ ½ºÅÃÀ» ¾ð¿ÍÀεåÇϱâ Àü¿¡ È£ÃâµÈ´Ù.
PVOID AddVectoredExceptionHandler(
ULONG FirstHandler,
PVECTORED_EXCEPTION_HANDLER VectoredHandler
);
ULONG RemoveVectoredExceptionHandler(
PVOID VectoredHandlerHandle
);
LONG CALLBACK VectoredHandler(
PEXCEPTION_POINTERS ExceptionInfo
);
Çڵ鷯´Â ¿©·¯°³ Á¸ÀçÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌµé °£ÀÇ ½ÇÇà ¼ø¼´Â AddVectoredExceptionHandler ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚÀÎ FirstHandler °ªÀ¸·Î Á¶Á¤ÇÒ ¼ö ÀÖ´Ù. 0ÀÌ ¾Æ´Ñ °ªÀÏ °æ¿ì, ù¹øÂ°·Î ½ÇÇàÇÏ°Ô µÇ°í, 0ÀÏ °æ¿ì ¸¶Áö¸·À¸·Î ½ÇÇàÇÏ°Ô µÈ´Ù. °°Àº °ªÀ¸·Î 2°³ÀÇ Çڵ鷯¸¦ Ãß°¡ÇÑ °æ¿ì, ¸ÕÀú Ãß°¡ÇÑ Çڵ鷯ºÎÅÍ ½ÇÇàÇÏ°Ô µÈ´Ù.
VEH Çڵ鷯ÀÇ ¸®ÅϰªÀº 2°¡Áö Áß¿¡ Çϳª¿©¾ßÇÑ´Ù.
- EXCEPTION_CONTINUE_EXECUTION : SEH¸¦ Æ÷ÇÔÇØ ´õ ÀÌ»óÀÇ Çڵ鷯´Â ½ÇÇàµÇÁö ¾Ê´Â´Ù. ½ÇÇàÀº ¿¹¿Ü°¡ ¹ß»ýÇÑ °÷ºÎÅÍ ´Ù½Ã ½ÃÀ۵ȴÙ.
- EXCEPTION_CONTINUE_SEARCH : ´ÙÀ½ VEH ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù. ¾ø´Ù¸é ½ºÅà ¾ð¿ÍÀε带 ¼öÇàÇÑ´Ù.
8 ¸µÅ©
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)