PlaidCTF 의 Harry_potter 문제를 봐도 그렇고 리눅스 g++ 의 Exception Handling 방식을 공부해봐야 할것같다...
일단 C++ 에서 try-catch 로 싼 블록상에서 발생하는 익셉션은 Linux 네이티브 익셉션과 C++ 익셉션 두가지로 나뉠수 있다. 여기서 자바나 파이썬등과 다르게 C++ 코드는 VM 위에서 실행되는것이 아니라 그런지 divide by zero 와 같은 네이티브 익셉션이 발생하면 디폴트로는 커널 익셉션 핸들러가 이를 처리한다. 즉 catch 로 가지 않는다. 아무래도 throw 가능한 사전에 정의된 C++ 익셉션이 발생했을 때에만 catch 로 넘어가도록 되있는것 같은데 그 방식이 signal 핸들러를 수정해서 하는건지 어떤식인지 정확히 모르겠다. 일단 Windows 의 경우 FS[0] 과 같은 사전약속된 곳에 ExceptionRecord 구조체 연결리스트의 헤드포인터가 언제나 존재해서 특별히 OS 의 API 등에 의존하지 않고 익셉션 핸들러를 SEH 체인에 등록하지만 리눅스의 경우 signal, sigaction 등과같은 시스템콜을 통해서 signal 핸들러를 등록해야 하고, 해당 과정을 통해서 익셉션 핸들링을 구현하는것 같다. DWARF 및 더 자세한 내용은 계속 알아봐야 할듯싶다...
1. 질문
> I am working through a C++ tutorial and have arrived at the chapter on
> exception handling. The example program sets up a try{} catch() {} set
> of blocks for catching a divide by zero exception. The problem is that
> g++ on Sid is quitting at the divide by zero statement and seemingly
> ignoring the try/catch blocks.
2. 답변
A divide by zero generates a SIGFPE (floating point exception), whose
default action is to immediately terminate the process. It's
important to note that this is /not/ a C++ exception, i.e. a thrown
value, but a UNIX process control signal. In consequence, the
presence of the try/catch blocks has no effect on the process
terminating; the process was killed by the Linux kernel when the
divide by zero was trapped.
See signal(7) and sigaction(2) for more detail. In particular, you
could register a signal handler to ignore the SIGFPE, or to set a
global or thread-local flag which could then be used to throw a C++
exception when a divide by zero occurs.
Regards,
Roger
'Programming' 카테고리의 다른 글
Reverse hash("crc32") algorithm for PHP 5.5 (0) | 2014.06.02 |
---|---|
How ptrace works in Linux (0) | 2014.05.29 |
C++ SEH Handling (0) | 2014.04.02 |
Debugging multi-threaded application with GDB attaching (0) | 2014.03.18 |
Linux DDD Debuger (0) | 2014.03.13 |