[C++] C++์์ ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH) ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ์ C++ ์์ธ ์ฒ๋ฆฌ
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ๋ Microsoft Windows์ ๊ธฐ๋ณธ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ด๋ฉฐ, ์ํํธ์จ์ด์ ํ๋์จ์ด ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๊ณ ์ค๋ช ํ์์ต๋๋ค. ์ด๋ฌํ ๋ด์ฉ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH, Structured Exception Handling) ๊ธฐ์ด ์ด์ผ๊ธฐ
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH, Structured Exception Handling) ๊ธฐ์ด ์ด์ผ๊ธฐ
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH)๋? ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(์ดํ SEH)๋ ํ๋์จ์ด์ ์ํํธ์จ์ด ์์ธ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ๋ Microsoft Windows์ ๊ธฐ๋ณธ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ํ๋์จ์ด ์์ธ๋ ์์ธ๊ฐ ๋ฐ์ํ ์ฃผ์ฒด๊ฐ CPU
luckygg.tistory.com
๊ทธ๋ฆฌ๊ณ C++ ์์ธ ๋ฌธ๋ฒ์ธ try
, catch
, throw
๋ ๋ด๋ถ์ ์ผ๋ก ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(์ดํ SEH, Structured Exception Handling) ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ๊ตฌํ๋์ด ์๋ค๋ ๋ด์ฉ๋ ์ธ๊ธํ์ต๋๋ค. ์ด์จ๋ , ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด C++ ์ธ์ด์์๋ C++ ์์ธ ์ฒ๋ฆฌ ๋ฌธ๋ฒ์, C#์์๋ C# ์์ธ ์ฒ๋ฆฌ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋ณธ๋ฌธ์์๋ C++ ์ธ์ด์์ SEH๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
C++์์ SEH ์ฌ์ฉํ๊ธฐ
๊ฐ๋จํ ํ ์คํธ๋ฅผ ์ํด Visual Studio 2019์์ ์ฝ์ ์ฑ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ ๋งํฌ์ ๊ธฐ๋ณธ ์์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
https://learn.microsoft.com/ko-kr/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-170
Structured Exception Handling (C/C++)
Microsoft C/C++์ ๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ ๊ฐ์์ ๋๋ค.
learn.microsoft.com
์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#include <stdio.h>
#include <Windows.h>
#include <exception>
class TestClass
{
public:
~TestClass()
{
printf("Destroying TestClass!\r\n");
}
};
__declspec(noinline) void TestCPPEX()
{
#ifdef CPPEX
printf("Throwing C++ exception\r\n");
throw std::exception("");
#else
printf("Triggering SEH exception\r\n");
volatile int *pInt = 0x00000000;
*pInt = 20;
#endif
}
__declspec(noinline) void TestExceptions()
{
TestClass d;
TestCPPEX();
}
int main()
{
__try
{
TestExceptions();
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Executing SEH __except block\r\n");
}
return 0;
}
ํด๋น ์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ํ์๋ฉ๋๋ค.
Triggering SEH exception //24๋ฒ ์งธ
Executing SEH __except block //44๋ฒ ์งธ
ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด CPPEX
๊ฐ ์ ์๋์ด ์์ง ์์ 24๋ฒ์งธ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๊ณ , ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ๊ทผ์ ์๋ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ __except
ํํฐ์ ์ํด 44๋ฒ์งธ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ ๋์์
๋๋ค. ์ฌ๊ธฐ์, TestClass ๊ฐ์ฒด์ ์๋ฉธ์๊ฐ ์ ์๋์ด ์๋๋ฐ ํธ์ถ๋์ง ์์ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ง์ฝ, ํ๋ก์ ํธ ์์ฑ์ ๋ช
๋ น์ค์ /DCPPEX
๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฒฐ๊ณผ๋ ๋ฌ๋ผ์ง๋๋ค.
์๋์ ๊ฐ์ด 14๋ฒ์งธ ์ค์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
Throwing C++ exception
Destroying TestClass! //14๋ฒ ์งธ
Executing SEH __except block
/DCPPEX
๋ช
๋ น์ค์ ์ถ๊ฐํ๋ฉด CPPEX
๊ฐ ์ ์๋์ด C++ ์์ธ์ธ throw๊ฐ ํธ์ถ๋๋ฉด์ ์๋ฉธ์๊ฐ ํธ์ถ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง์ง๋ง์ผ๋ก, C++ ์์ธ์ SEH๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด C++ ์์ธ ์ฒ๋ฆฌ ๊ฐ๋ฅ ์ต์
์ /EHa
๋ก ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
์ด๋ ๊ฒ ์ต์
์ ๋ณ๊ฒฝํ๋ฉด ๋ช
๋ น์ค์ /DCPPEX
๊ฐ ์๋ ์๋ ์๊ด์์ด, ์๋ฉธ์๊ฐ ์ ์์ ์ผ๋ก ํธ์ถ๋ฉ๋๋ค.
Throwing C++ exception
Destroying TestClass! //14๋ฒ ์งธ
Executing SEH __except block
'Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
ํ๋ก๊ทธ๋จ์์ ์ผ๋ฐ์ ์ธ ์์ธ ์ฒ๋ฆฌ(Exception Handling)ํ๋ ๋ฐฉ๋ฒ
ํ๋ก๊ทธ๋จ์์ ์ผ๋ฐ์ ์ธ ์์ธ ์ฒ๋ฆฌ(Exception Handling)ํ๋ ๋ฐฉ๋ฒ
2022.10.15 -
์์ธ ์คํ ํ๊ธฐ(Stack Unwinding)์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ์ํฅ
์์ธ ์คํ ํ๊ธฐ(Stack Unwinding)์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ์ํฅ
2022.10.12 -
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH, Structured Exception Handling) ๊ธฐ์ด ์ด์ผ๊ธฐ
๊ตฌ์กฐ์ ์์ธ ์ฒ๋ฆฌ(SEH, Structured Exception Handling) ๊ธฐ์ด ์ด์ผ๊ธฐ
2022.08.28