본문 바로가기

Programming

Exception Handling in Linux g++

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