ꡬ쑰μ μμΈ μ²λ¦¬(SEH, Structured Exception Handling) κΈ°μ΄ μ΄μΌκΈ°
ꡬ쑰μ μμΈ μ²λ¦¬(SEH)λ?
ꡬ쑰μ μμΈ μ²λ¦¬(μ΄ν SEH)λ νλμ¨μ΄μ μννΈμ¨μ΄ μμΈλ₯Ό λͺ¨λ μ²λ¦¬νλ Microsoft Windowsμ κΈ°λ³Έ μμΈ μ²λ¦¬ λ©μ»€λμ¦μ λλ€. νλμ¨μ΄ μμΈλ μμΈκ° λ°μν μ£Όμ²΄κ° CPUμ κ°μ νλμ¨μ΄λΌλ κ²μ΄κ³ , μννΈμ¨μ΄ μμΈλ μ¬μ©μκ° μμ±ν μννΈμ¨μ΄ λ° μ΄μ체μ κ° μμΈμ 주체λΌλ μλ―Έμ λλ€.
μ’ λ μ¬μ΄ μλ₯Ό λ€μλ©΄, μ΄λ€ μλ₯Ό 0μΌλ‘ λλλ μ°μ°μ΄λ μ κ·Όν μ μλ λ©λͺ¨λ¦¬μ μ κ·Όμ μλνλ λͺ λ Ήμ΄λ₯Ό μ€ννλ€λ©΄ νλμ¨μ΄ μμΈκ° λ°μνκ³ , μ ν¨νμ§ μμ μΈμμ κ°μ μ§μ ν λ μννΈμ¨μ΄ μμΈκ° λ°μν μ μμ΅λλ€.
μ΄μ²λΌ, νλμ¨μ΄μ μννΈμ¨μ΄ μμΈλ₯Ό λͺ¨λ μ²λ¦¬νλ λ©μ»€λμ¦μ΄ SEHμ λλ€.
https://docs.microsoft.com/ko-kr/windows/win32/debug/structured-exception-handling
μ¬μ€ μΌλ° μμ© νλ‘κ·Έλ¨ κ°λ°μλΌλ©΄ SEHμ λν΄ κΉκ² μ νμλ μλ€κ³ μκ°ν©λλ€. SEHλ μ£Όλ‘ μ΄μ체μ λ₯Ό μμ μ μΌλ‘ κ°λ°νκΈ° μν μμΈ μ²λ¦¬λ‘, μΌλ° μμ© νλ‘κ·Έλ¨ κ°λ°μλ μΈμ΄μμ μ§μνλ μμΈ μ²λ¦¬λ₯Ό μ λ€λ€μΌ ν©λλ€. μλ₯Ό λ€μ΄, C++ νλ‘κ·Έλ¨μ C++ λ¬Έλ²μΈ try-catch
, throw
λ₯Ό μ΄μ©νμ¬ μμΈλ₯Ό λ€λ£¨λ©΄ λ©λλ€. λ¬Όλ‘ , SEHλ₯Ό μ¬μ©ν΄λ 무방ν©λλ€.
μ°Έκ³ λ‘, C++ μμΈ μ²λ¦¬λ λ΄λΆμ μΌλ‘ μ»΄νμΌλ¬μ μλμ°κ° μ§μνλ SEH κΈ°λ₯μ μ΄μ©νμ¬ κ΅¬νλμμ΅λλ€.
SEH κΈ°λ³Έ λ¬Έλ²
SEHλ λ κ°μ§ μ£Όμ κΈ°λ₯μΌλ‘ ꡬμ±λμ΄ μμ΅λλ€. λ°λ‘, μ’ λ£ μ²λ¦¬κΈ°μ μμΈ μ²λ¦¬κΈ°μ λλ€. κ° μ²λ¦¬μ λν΄ μ°¨λ‘λλ‘ μμλ³΄κ² μ΅λλ€.
1. μ’ λ£ μ²λ¦¬κΈ°(Termination Handler)
μ’
λ£ μ²λ¦¬κΈ°λ __try
λΈλ‘ λ΄μ μ μ΄κ° μ΄λ»κ² λΉ μ Έλμ€λ __finally
λΈλ‘μ μ½λκ° λ°λμ μνλ κ²μ΄λΌλ κ²μ 보μ₯ν©λλ€. μλ μμ λ μ’
λ£ μ²λ¦¬κΈ° SEH ꡬ문μ
λλ€.
__try
{
//...
}
__finally
{
//μ’
λ£ μ²λ¦¬κΈ°
//...
}
μ΄μ 체μ μ μ»΄νμΌλ¬λ νμ μ’
λ£ μ²λ¦¬κΈ°μ μ½λκ° μνλλλ‘ λ³΄μ₯ν©λλ€. λ¨, ExitProcess
, ExitThread
, TerminateProcess
, TerminateThread
μ κ°μ ν¨μλ₯Ό νΈμΆνμ¬ νλ‘μΈμ€λ μ€λ λκ° μ’
λ£λλ κ²½μ°λ μ μΈν©λλ€. μ΄λ¬ν μν©μ μ μΈνκ³€, __try
λΈλ‘ λ΄μμ return
, goto
μ κ°μ λ¬Έμ νΈμΆνλλΌλ μ’
λ£ μ²λ¦¬κΈ°λ νμ νΈμΆλ©λλ€.
κ·Έλ°λ°, μ΄λ»κ² μ’
λ£ μ²λ¦¬κΈ°μΈ __finally
λΈλ‘μ΄ νμ νΈμΆλλ κ²μΌκΉμ? μ΄λ, μ»΄νμΌλ¬κ° __try
λΈλ‘ λ΄μμ λΉ μ Έλκ°κΈ° μ μ __finally
λΈλ‘μ λ°λμ μνλ μ μλλ‘ μΆκ°μ μΈ μ½λλ₯Ό μμ±νκΈ° λλ¬Έμ
λλ€. μ΄λ₯Ό λ‘컬 μΈμμΈλ(Local Unwind)
λΌκ³ ν©λλ€.
λ‘컬 μΈμμΈλ(Local Unwind)
μμ μ€λͺ
ν λλ‘, μμ€ν
μ΄ __try
λΈλ‘μ λΉ μ Έλκ°κΈ° μ μ __finally
λΈλ‘μ λ¨Όμ μνν΄μΌ νλ μ½λλ₯Ό μΆκ°λ‘ μμ±νλ κ²μ μλ―Έν©λλ€. κ·Έλ°λ° 'μ½λλ₯Ό μΆκ°λ‘ μμ±νλ€'λΌλ μ‘°κ±΄μ΄ λμ λλλ°μ. μΆκ°μ μΈ μ½λλ₯Ό μμ±νλ€λ κ²μ κ²°κ΅ λΉμ©μ΄ λ°μνλ€λ κ²μ
λλ€. κ·Έλ¦¬κ³ λ°μν λΉμ©μ νλ‘κ·Έλ¨ μν μ±λ₯μλ μ’μ§ μμ μν₯μ μ€ μ μμ΅λλ€.
λ°λΌμ, λ‘컬 μΈμμΈλκ° λ°μνμ§ μλλ‘ μ μ΄μ νλ¦μ μμ°μ€λ½κ² μμ±ν΄μΌ ν©λλ€. __try
λΈλ‘μ μννκ³ μμ°μ€λ½κ² __finally
λΈλ‘μ μννλ κ²μ΄ λΉμ©μ μ΅μννλ λ°©λ²μ
λλ€.
λ νλμ μ£Όμ μ¬νμΌλ‘, __try
λΈλ‘μμλ μλλ¬μ λΉ μ Έλκ°λ μ½λλ₯Ό μμ±νμ§ μλ κ²μ κΆμ₯ν©λλ€. μλ₯Ό λ€μ΄, return
, goto
, continue
, break
μ κ°μ λ¬Έμ₯μ μ¬μ©νμ§ μλ κ²μ΄ κ°μ₯ μ’μ λ°©λ²μ
λλ€. μ»΄νμΌλ¬κ° λ‘컬 μΈμμΈλμ κ°μ μμ
μ μννμ§ μμλ λκΈ° λλ¬Έμ, μ’ λ μμ μ½λλ₯Ό μμ±ν μ μκ³ μ΄λ μ΅μνμ λΉμ©μΌλ‘ μ½λλ₯Ό μ’ λ λΉ λ₯΄κ² λμνλλ‘ ν μ μκΈ° λλ¬Έμ
λλ€.
__leave ν€μλ
__try
λΈλ‘ λ΄μμ __leave
ν€μλλ₯Ό μ¬μ©νλ©΄ __try
λΈλ‘μ κ°μ₯ λ§μ§λ§μΌλ‘ μ΄λνκ² λ©λλ€. μ΄λ κ² νλ©΄ μμμ μ€λͺ
ν κ²μ²λΌ, μ½λ μν νλ¦μ΄ μμ°μ€λ½κ² __try
λΈλ‘μμ __finally
λΈλ‘μΌλ‘ μ΄λνκΈ° λλ¬Έμ μ΄λ ν μΆκ° λΉμ©μ΄ λ°μνμ§ μμ΅λλ€.
2. μμΈ μ²λ¦¬κΈ°(Exception Handler)
μμΈ μ²λ¦¬κΈ°λ __try
λΈλ‘μ μ½λλ₯Ό μννλ μ€ μμΈκ° λ°μνλ©΄ __except
λ¬Έμμ νν°λ₯Ό νκ°νμ¬ μΆκ° λμμ μννκ² λ©λλ€. μλ μμ λ μμΈ μ²λ¦¬κΈ° SEH ꡬ문μ
λλ€.
__try
{
//...
}
__except (μμΈ νν°)
//μμΈ μ²λ¦¬κΈ°
//...
}
μμΈ μ²λ¦¬κΈ°μ μμΈ νν°μ λν΄ μ€λͺ ν λ΄μ©μ΄ λ μμ΅λλ€. κΉκ² λ€μ΄κ°κΈ° μ μ, SEH λ¬Έλ²μ λν΄ μ κΉ μ 리νκ³ μ€λͺ μ μ΄μ΄κ°κ² μ΅λλ€.
SEH λ¬Έλ² μ€κ° μ 리
SEH λ¬Έλ²μΈ __try
λΈλ‘μ λ§λ€λ©΄ λ°λμ μ’
λ£ μ²λ¦¬κΈ°μΈ __finally
λΈλ‘ λλ μμΈ μ²λ¦¬κΈ°μΈ __except
λΈλ‘μ΄ λ°λΌμμΌ ν©λλ€. __try
λΈλ‘μ __finally
λΈλ‘κ³Ό __except
λΈλ‘μ λμμ κ°μ§ μ μμ΅λλ€. κ·Έλ¦¬κ³ μ¬λ¬ κ°μ __except
λΈλ‘λ κ°μ§ μ μμ΅λλ€.
νμ§λ§ __try-__finally
λΈλ‘ λ΄μ __try-__except
λΈλ‘μ ν¬ν¨μν€κ±°λ λλ κ·Έ λ°λλ‘ κ΅¬μ±νλ κ²μ κ°λ₯ν©λλ€.
3. μμΈ νν°
κ³μν΄μ μμΈ μ²λ¦¬κΈ°μ μμΈ νν°μ λν΄ μ€λͺ νκ² μ΅λλ€. μμΈ νν°λ μ΄ μΈ κ°μ§λ₯Ό μ 곡νλ©°, κ° νν°λ§λ€ μλ‘ λ€λ₯Έ λμμ μννκ² λ©λλ€.
3-1. EXCEPTION_EXECUTE_HANDLER
__try
{
//...
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
//μμΈ μ²λ¦¬ μν
//...
}
κΈλ‘λ² μΈμμΈλ(Global Unwind)
λ₯Ό μνν ν __except
λΈλ‘μ μννκ² λ©λλ€. __except
λΈλ‘μ μ½λκ° λͺ¨λ μνλκ³ λλ©΄ __except
λ°λ‘ λ€μμ μ½λλ₯Ό μννκ² λ©λλ€.
κΈλ‘λ² μΈμμΈλ(Global Unwind)
μμμ μ’
λ£ μ²λ¦¬κΈ°λ₯Ό μ€λͺ
ν λ λ‘컬 μΈμμΈλλ₯Ό μ€λͺ
νμμ΅λλ€. μ΄λ¦μ΄ λΉμ·ν κΈλ‘λ² μΈμμΈλλ₯Ό μ μ§κΈ μΈκΈνλλ©΄, κΈλ‘λ² μΈμμΈλλ μμΈ νν°κ° EXCEPTION_EXECUTE_HANDLER
μΌ λ λμνκΈ° λλ¬Έμ
λλ€. μμΈ νν°κ° EXCEPTION_EXECUTE_HANDLERλ‘
νκ°λλ©΄ __try-__except
λΈλ‘ λ΄μ λͺ¨λ __try-__finally
λΈλ‘μ μννλ κ²μ κΈλ‘λ² μΈμμΈλλΌκ³ ν©λλ€.
3-2. EXCEPTION_CONTINUE_EXECUTION
__try
{
//...
}
__except(EXCEPTION_CONTINUE_EXECUTION)
{
//μμΈ μ²λ¦¬ μν
//...
}
μμΈ νν°κ° EXCEPTION_CONTINUE_EXECUTION
λ‘ νκ°λλ©΄ μμΈλ₯Ό λ°μνλ μ½λλ₯Ό λ€μ νλ² μννλλ‘ ν©λλ€. λ§μ½, μμΈ λ°μ ν μ μ ν μ‘°μΉκ° μ·¨ν΄μ§μ§ μμλ€λ©΄ λ€μ λ¬Έμ κ° λ°μνκ² λκ² μ£ . μ΄ κ²½μ° λ λ€λ₯Έ μμΈκ° λ°μν μλ μκ³ λλ 무ν 루νμ λΉ μ§ κ°λ₯μ±λ μμ΅λλ€. μ΄λ 곧 λλ²κΉ
μ΄ μ΄λ €μ λ¬Έμ ν΄κ²°μ μ΄λ €μμ΄ λ°μνκ² μ£ .
3-3. EXCEPTION_CONTINUE_SEARCH
__try
{
//...
}
__except(EXCEPTION_CONTINUE_SEARCH)
{
//μμΈ μ²λ¦¬ μν
//...
}
μμΈ νν°κ° EXCEPTION_CONTINUE_SEARCH
λ‘ νκ°λλ©΄, κ°μ₯ μ΅κ·Όμ μ§μ
νλ __try
λΈλ‘ μ€ __except
λΈλ‘μ κ°μ§ κ³³μΌλ‘ μ΄λνμ¬ μμΈ νν°λ₯Ό νκ°νκ² λ©λλ€. __try
λΈλ‘μ΄ __finally
λΈλ‘μ κ°μ§κ³ μλ κ²½μ° κ²μ λμμμ μ μΈλ©λλ€.
μμΈκ° μ²λ¦¬λλ μ 체 νλ¦
μμμ μΈκΈν κ° μμΈ νν°μ λμ νλ¦μ νλμ μ λ¦¬ν΄ λ³΄κ² μ΅λλ€.
μ°Έκ³
Windows via C/C++ Fifth Edition, Jeffrey Richter
'Programming' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λκΈ
μ΄ κΈ κ³΅μ νκΈ°
-
ꡬλ
νκΈ°
ꡬλ νκΈ°
-
μΉ΄μΉ΄μ€ν‘
μΉ΄μΉ΄μ€ν‘
-
λΌμΈ
λΌμΈ
-
νΈμν°
νΈμν°
-
Facebook
Facebook
-
μΉ΄μΉ΄μ€μ€ν 리
μΉ΄μΉ΄μ€μ€ν 리
-
λ°΄λ
λ°΄λ
-
λ€μ΄λ² λΈλ‘κ·Έ
λ€μ΄λ² λΈλ‘κ·Έ
-
Pocket
Pocket
-
Evernote
Evernote
λ€λ₯Έ κΈ
-
[C++] C++μμ ꡬ쑰μ μμΈ μ²λ¦¬(SEH) μ¬μ©νλ λ°©λ²
[C++] C++μμ ꡬ쑰μ μμΈ μ²λ¦¬(SEH) μ¬μ©νλ λ°©λ²
2022.10.18 -
νλ‘κ·Έλ¨μμ μΌλ°μ μΈ μμΈ μ²λ¦¬(Exception Handling)νλ λ°©λ²
νλ‘κ·Έλ¨μμ μΌλ°μ μΈ μμΈ μ²λ¦¬(Exception Handling)νλ λ°©λ²
2022.10.15 -
μμΈ μ€ν νκΈ°(Stack Unwinding)μ νλ‘κ·Έλ¨ μ±λ₯ μν₯
μμΈ μ€ν νκΈ°(Stack Unwinding)μ νλ‘κ·Έλ¨ μ±λ₯ μν₯
2022.10.12