본문 바로가기

카테고리 없음

Linux signal

Windows SEH를 공부하다가 Linux에도 이런 Exception handler가 있는지 궁금했다.

 

보통 나는 서버를 Windows가 아닌 Linux에 올리기때문에

 

Exception이 일어나면 Register,memory(heap stack)를 저장해두고 분석하고싶어서

 

Linux에는 SEH는 없고 signal로 예외를 처리한다.

 

signal은 linux 운영체제 수준에서 발생하는 비동기적 이벤트 메커니즘인데, 잘못된 메모리 접근이나 다른 인터럽트들이 signal로 프로세스에 전달이 된다.

 

이를 처리하기 위해서는 signal handler를 등록하면 된다.

 

아무 처리하지 않으면 os기본 exception 처리 루틴을 따라 종료되거나 멈추거나 등등 한다.

 

 

아래부턴 팩트 일수도있고 아닐수도있는 나의 이해

 

C++은 try catch를 통해 예외가 발생할 수 있는 코드에 예외 가능성 있는걸 체크하고 throw해서 잡아서 처리하고

 

C#같은 경우 내부적으로 알아서 throw해주는 것도 있어서 편하다.

 

하드웨어 오류가 나면 WIN에서는 SEH루틴을 타고 LINUX에선 SIGNAL이 날아와 SIGNAL HANDLER로 처리를 한다.

 

 

throw되면 스택타고 내려가면서 catch를 찾고 거기서 handling

 

c++은 

#include <iostream>
#include <stdexcept> // std::runtime_error를 사용하기 위한 헤더

// 나누기 함수
double divide(double numerator, double denominator) {
    if (denominator == 0) {
        throw std::runtime_error("Error: Division by zero is not allowed.");
    }
    return numerator / denominator;
}

int main() {
    double num1, num2;

    // 사용자로부터 두 숫자를 입력받음
    std::cout << "Enter numerator: ";
    std::cin >> num1;
    std::cout << "Enter denominator: ";
    std::cin >> num2;

    try {
        // 나누기 수행
        double result = divide(num1, num2);
        std::cout << "Result: " << result << std::endl;
    } catch (const std::runtime_error& e) {
        // 예외 처리
        std::cerr << e.what() << std::endl;
    }

    return 0;
}

 

c#은

 

using System;

class Program
{
    static void Main()
    {
        try
        {
            // Code that might throw an exception
            int numerator = 10;
            int denominator = 0;
            int result = numerator / denominator; // This will throw DivideByZeroException
        }
        catch (DivideByZeroException ex)
        {
            // Handle the exception
            Console.WriteLine("Error: Attempted to divide by zero.");
            Console.WriteLine("Exception message: " + ex.Message);
        }
        catch (Exception ex)
        {
            // Handle other exceptions
            Console.WriteLine("An unexpected error occurred: " + ex.Message);
        }
    }
}

 

자동으로 잡아준다