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

2011년 1월 20일 목요일

HandBrake for osx

iphone을 사용하면 mp4인코딩을 해야 한다.
윈도우7에서 다음팟인코더를 사용했다.
인코딩이 꾀나 CPU를 많이 요구하고 시간이 많이 걸리고 해서 한동안 집에 있는 구형 노트북이
발열 고열 피로에 시달렸다. 이유로 T60이 쿨러에 이상이 생긴건지도??

회사 장비를 퇴근후에 인코딩 머신으로 돌리려고
ubuntu에서 스크립트로 하는것을 찾아서 해보려 했지만 자막이 맘에 안들었고 시간도 많이 소요되고 파일사이즈도 크고 기대에 못미친다.
간혹 아이폰이 인식 하지 못하는 파일 포멧으로 떨어지기도 하고.

맥을 쓰게 되서 맥에서 팟벗이란 놈으로 해봣더니 스크립트 오류 메세지가 자주 나오고
결국에는 회사서도 버추어박스에 있는 xp가 다음팟인코더를 수행하는 방식으로 인코딩을 했다.

근데 요게 또 문제를 일으키는게 버추어박스속 xp랑 맥이랑 삼바로 디스크를 공유하는데
맥에 있는 동영상 파일을 삼바로 접근해서 인코딩을 하면
이상하게 xp메모리가 마구 올라가다가 사망에 이른다.
이것은 아마도 xp버그일듯하다.

결국 동영상을 xp속으로 카피해서 돌려야 한다.
결국 귀차니즘이 몰려오고
그래서 검색 했다. 도대체 맥 유저들은 어떤 인코더를 쓰는가?

http://mac.appstorm.net/roundups/video-roundups/7-video-encoding-apps-for-mac/

음 이걸 보니 handbrake라는게 무료이고 괞찮은듯 하다.
하지만 이것도 좀더 조사를 하고 실제로 테스트 해보려 하니 smi자막은 지원이 안된다.

smi2srt소스를 구해다가 또 맥에서 빌드했다. strupr()함수가 맥에서는 라이브러리에 없는듯
해서 하나 맨드러 줘서 넣었더니 빌드가 되더라.

결국은 smi2srt를 써서 일단 srt를 얻은 다음 이걸 UTF8 로 인코딩 하는 작업을 해야 한다.
이상한건 iconv가 맥에서 했을때 UTF8로 잘 안되는거 같다는 것이다.

그렇다고 버추어박스에 메모장을 쓰자니 머 그럼 또 귀차니즘이 몰려오고..

최금 맥 앱스토어에서 구한 TextWrangler라는 편집기에 인식하는 인코딩을 KOREAN(Windows,DOS)
를 추가한다음 이걸로 srt 파일을 열었다가 UTF-8로 다시 저장 했다.

handbrake로 자막을 추가하고 돌려 보는중 과연 잘될까??


2011년 1월 19일 수요일

thinkpad T60 cooler maintenance 2


결국 끝장을 보고말았다.

처음이 어렵지 한번 분해 하고 나니 두번째는 아주 수월하다.

맥미니도 그랬고 thinkpad도 그렇고 처음이 어렵지 한번 드라이버질을 하기 시작 하면 두번째는 아주 쉬워진다.

마치 데스크탑을 분해 하듯 나사들을 쭉쭉 풀어 재낀다음 쿨러를 들어내고

저번에 하지 못했던 쿨러 자체를 열었다. 그리고 오일을 한방울 넣어 주었다.
이로써 나의 노트북은 소음을 줄였다.

하지만 맥미니가 더 조용하다.

2011년 1월 14일 금요일

VirtualBox 3.x to 4.0 upgrade



VirtualBox 3.x 버젼을 항상 버젼업을 하면서 잘썻다.

4.0이 나왔다는 소식을 접했지만 자동 업데이트는 되지 않더라.

날잡아서 버젼업을 해야지 맘먹고 오늘 해보았다.

먼저 혹시나 하는 맘으로 가상시스템 내보내기로 설치된 OS두개를 내보냈다.

엄청나게 긴시간 OS가 두개라서 .

완료이후 바로 다운로드 받고 설치에 들어갔다. osx에서 프로그램 설치는 너무 간단하다.


맥용으로 받아서 .dmg 클릭 하면 머 걍 설치가 된다.

3.x 버젼에대해 언인스톨 작업을 하지 않았는데. 걍 된다.

괜히 가상시스템 내보내기를 했다.

절로 3.x때에 설치된 OS를 그대로 인식하고 잘도 부팅된다.

게스트확장만 4.0으로 업데이트 해줬더니 웬지 가상시스템 xp가 빨라진듯 하다.

결론은 왜 자동업데이트를 안해줫는지 몰라도
osx에선 3.x 를 사용하고 있다면

그냥 4.0 받아서 설치하면 될듯.