๋ฐ˜์‘ํ˜•

๊ตฌ์กฐ์  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ 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์—์„œ ์ฝ˜์†” ์•ฑ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

C++-์ฝ˜์†”-์•ฑ-ํ”„๋กœ์ ํŠธ-์ƒ์„ฑํ•˜๊ธฐ
C++ ์ฝ˜์†” ์•ฑ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ๋งํฌ์˜ ๊ธฐ๋ณธ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

C++-๋ช…๋ น์ค„์—-์˜ต์…˜-์ถ”๊ฐ€ํ•˜๊ธฐ
C++ ๋ช…๋ น์ค„์— ์˜ต์…˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

์•„๋ž˜์™€ ๊ฐ™์ด 14๋ฒˆ์งธ ์ค„์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

Throwing C++ exception
Destroying TestClass! //14๋ฒˆ ์งธ
Executing SEH __except block

/DCPPEX ๋ช…๋ น์ค„์„ ์ถ”๊ฐ€ํ•˜๋ฉด CPPEX๊ฐ€ ์ •์˜๋˜์–ด C++ ์˜ˆ์™ธ์ธ throw๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, C++ ์˜ˆ์™ธ์™€ SEH๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด C++ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ์˜ต์…˜์„ /EHa๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

C++-์˜ˆ์™ธ-์ฒ˜๋ฆฌ-์˜ต์…˜-๋ณ€๊ฒฝ
C++ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์˜ต์…˜ ๋ณ€๊ฒฝ

์ด๋ ‡๊ฒŒ ์˜ต์…˜์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ช…๋ น์ค„์— /DCPPEX๊ฐ€ ์žˆ๋“  ์—†๋“  ์ƒ๊ด€์—†์ด, ์†Œ๋ฉธ์ž๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

Throwing C++ exception
Destroying TestClass! //14๋ฒˆ ์งธ
Executing SEH __except block

 

๋ฐ˜์‘ํ˜•