2011년 2월 25일 금요일

stack overflow 상태에서 sigaction처리 하기.

sigaction()
signal handler를 작성해서 특정 시그널에 따라 어떤 조치를 취하도록 할 수 있다.

시그널이  발생했을 때 에러 원인을 파악하기 위해

 backtrace()
backtrace_symbol()
함수를 이용해서 호출 스택까지도 출력할 수 있다.

문제는 stack overflow가 발생해서 SIGSEGV 가 된경우 이를 처리할 함수 조차 호출 할 수 없다.

이를 해결 하기 위해 sigaltstack()함수로 미리 스택영역을 잡아두는 방법이 있다.



$cat stack_overflow.c
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define STACK_SIZE ( 4 * 1024 )
static int is_altstack_defined =0 ;
static char tmp_stack[STACK_SIZE];
void sig_segv(int signo);

int foo()
{
    return foo();
}
void sig_segv(int signo)
{
    printf("stack overflow\n");
    exit(-1);
}

static void register_sigaltstack()
{
    stack_t newSS, oldSS;

    if(is_altstack_defined)
    {
        return;
    }

    newSS.ss_sp = tmp_stack;

    newSS.ss_size = STACK_SIZE;
    newSS.ss_flags = 0;

    if(sigaltstack(&newSS, &oldSS) < 0)
    {
        printf ("error altstack");
    }

    is_altstack_defined = 1;
}


int main(int argc, char * argv[])
{
    int i = 0;
    struct sigaction sigsegv;
 
    register_sigaltstack();

    sigsegv.sa_handler = sig_segv;
    sigemptyset(&sigsegv.sa_mask);
    sigsegv.sa_flags = SA_ONSTACK;

    if( sigaction(SIGSEGV, &sigsegv, 0 ) == -1)
    {
        printf("signal SIGSEGV error");
        return -1;
    }

    foo();
}





위코드를 스레드로 변경 하면 동작 하지 않는다.
스레드에서 foo()  무한 재귀 함수를 호출 해서 스택 오버플로우가 발생했을때는 동작 하지 않는다.

여러 삽질 끝에 답을 알아 냈는데.

스레드 마다. sigaltstack() 을 해줘야 동작 한다.

여기에 관해서 찾은 글귀..
Operating in a multithreaded environment
If a process calls sigaction and then spawns pthreads within it, then those pthreads will inherit the signal handlers that were already installed. Apparently, this is not the case forsigaltstack: If a signal handler is installed with sigaction using a sigaltstack, and a thread spawned from that process is killed with the right signal, then the installed stack will not be found! The signal handler must instead be installed on each pthread individually. I’m not sure whether this is a bug in Linux or just a quirk of POSIX; in any case, I couldn’t find it documented anywhere.

VirtualBox 4.0.4 for OSX 심리스 모드 완벽 지원

윈도우버젼, 우분트버젼 OSX 버젼 모두 사용해 보았는데.
OSX에서 심리스 모드가 되지않아서
그냥 전체 화면으로 사용했다.

cmd키를 눌러서 포커스 빼고 ctrl + 방향키 로 화면 전환 하면서
작업을 했는데.

업그레이드 하고나니
심리스 모드가 완벽히 지원한다.

OSX에서 윈도우쓸때 아주 훌륭하고 편하게 되는듯 하다.

2011년 2월 23일 수요일

stack overflow , 컴파일 옵티마이저 레벨

stack overflow
옵티마이저 레벨에 따라 SIGSEGV가 나지 않고 무한 대기 할때가 있다.



$ gcc -O3 stack_overflow.c -o stack_overflow
$ ./stack_overflow

$ gcc -O2 stack_overflow.c -o stack_overflow
$ ./stack_overflow

$ gcc -O1 stack_overflow.c -o stack_overflow
$ ./stack_overflow
세그멘테이션 오류

$ cat stack_overflow.c
int foo()
{
    return foo();
}
int main(int argc, char * argv[])
{
    foo();
}

x86_64 linux에서 gcc 4.1.2
-O3, -O2 는 위코드가 무한대기 ctrl + c로 중지 시킨것이고
-O1 에서는 SIGSEGV가 발생한다.



컴파일러 최적화를 하면 오히려 스택오버플로우가 발생하지 않는것일까?


2011년 2월 7일 월요일

맥미니를 거실에서 사용하기

맥미니를 거실로 옴겼다.

무선키보드와 무선마우스
덕분에  apple wireless keyboard 89000 짜리를 사야했고
T60에 달려있던 MS 5000 notebook 마우스를 맥미니에 달아 줘야 했다.

모니터로 사용되는 TV
32인치 LG LCDTV 는 2007년 산인데 해상도가 1366x768 거의 넷북 수준의 해상도를 보인다.
처음 해상도의 충격 때문인지 D-SUB RGB  단자를 써서는 안되나 싶어서
눈이 그렇게 고급이 안인데도 혹시나 DVI-HDMI를 하면 좀 낳아질까 싶어서...

T60으로 영화 볼때는 그냥 RGB케이블 썻는데. 그리고 T60은 DVI 단자난 HDMI단자도 없고
결국 마트에서 8900짜리 또 삿다. 사기전에 혹시 사운드가 DVI-HDMI에서 라인입력으로 넣으면
안될까 걱정이 되어 회사분에 도움으로 사전 테스트를 거쳤다.

화질 변화가 있는지 없는지 나의 싸구려 눈으로는 별로 알아차릴수가 없는데.
트랜스포머 720p를 플레이 하니 아주깨끗하다.
느낌은 이걸 노트북으로 볼때보다 훨씬더 화질이 좋은듯하는 느낌.
덕분에 은준이는 트랜스포머 팬이 되었다. 아빠 로보트 틀어줘~~~

리모트컨트롤
거실로 옴긴 첫번째 이유는 컴퓨터 방이 너무 추워서다.
두번째 이유는 거실에서 TV와 합체 하면 많은 사용성이 생길거라 생각되서
근데 가족들이 거실에 나오면 난 맥미니를 꺼야 한다.
TV리모컨은 바로 외부입력을 변경 시켜 버리면 맥미니는 멀하는지 알수가 없다.
아이폰에 VNC를 설치해서 맥미니를 지켜 보다가 몰래 잠자기를 하던지 셧다운을 시킨다.

무선 공유기 IP time 꺼중에 고급사양인 N6004모델을 사용중인데
WOL기능이 있다.
안되더라
VNC 아이폰 프로그램도 업그레이드 하니 WOL기능이 있는데
안되더라
이거 왜 안될까? 맥미니가 너무 구형인가?
잠자기 상태에서는 잘도 일어난다. 근데이건 뭐 키보드 마우스가 무선인데 의미가 없다.
집에서 깨우고 싶은데.
정말 리모트에서는 깨울수가 없다. 잠자기 상태로 와이프가 내버려두지 않는다.
전원을 완전 차단시킨다.
정말 내가 원하는것은 거실에서 플러그는 꽂혀있는상태에서 TV도 시청중일때 WOL을 하고 싶은건데 이게 안되서 아쉽다.

결론
맥미니는 거실에서 쓸만한대, WOL이 아쉽다.
그리고 라인입력 요거 일반 헤드셋 마이크 꼽았더니 안되더라 마트에서 1만원 주고산 헤드셋
아들을 위해 헤드셋 하나 사주려고 했는데.. 쩝

맥미니는 돈잡아 먹는 기계 : 메모리 , 하드디스크, 무선키보드, 무선마우스, 헤드셋 X