Archive for 3월, 2009

함수의 리턴 주소 알아내기

월요일, 3월 23rd, 2009

프로파일링이나 함수 래핑으로 lock등의 작업을 가로채서 로깅할 때 호출한 쪽의 PC값을 알고 싶을 경우가 있습니다.

현재실행되는 함수 입장에서 보면 리턴 주소이죠

이 때 쓸 수 있는 함수가 gcc의 builtin함수로 __builtin_return_address() 입니다.

__builtin_return_address(level)

여기서 level은 call stack 에서 몇번째를 리턴할 것인지에 대한 값입니다.

__builtin_return_address(0) 하면 현재함수의 리턴주소가 나옵니다.

__builtin_return_address(1) 하면 나를 호출한 함수의 리턴주소가 나옵니다…

예제 코드를 짜봤습니다.

#include <stdio.h>
#include <stdlib.h>

int my_func1()
{
    void *addr;
    addr =
__builtin_return_address(0);
    printf(”1’s caller %p\n”,addr);
    printf(”hello 1\n”);
}
int my_func0()
{
    void *addr;
    printf(”hello 0\n”);
    addr = __builtin_return_address(0);
    printf(”0’s caller %p\n”,addr);
    my_func1();
}

int main(void)
{
    printf(”backtrace test\n”);
    printf(”main: %p\n”, (void *)main);
    printf(”my_func0: %p\n”, (void *)my_func0);
    printf(”my_func1: %p\n”, (void *)my_func1);
    my_func0();
    return 0;
}

 

이 소스코드를 컴파일해서 objdump해보면

080483d1 <my_func0>:

80483fc:   e8 a3 ff ff ff          call   80483a4 <my_func1>
8048401:   c9                      leave
8048402:   c3                      ret

08048403 <main>:

804845c:   e8 70 ff ff ff          call   80483d1 <my_func0>
8048461:   b8 00 00 00 00          mov    $0×0,%eax

이와 같이 호출하게 되어있고

실행해보면

backtrace test
main: 0×8048403
my_func0: 0×80483d1
my_func1: 0×80483a4
hello 0
0’s caller 0×8048461
1’s caller 0×8048401
hello 1

이렇게 나옵니다. call 바로 다음 주소–리턴 주소가 나오지요.

이외에도 몇가지 builtin함수들이 있습니다.

예를 들어 __builtin_frame_address(level)은 프레임 포인터를 반환합니다.

 

관련 포스트 :

gcc 컴파일 옵션으로 커스텀 프로파일 해서 실행 트레이스 뽑기

엑셀에서 가로 세로 셀을 바꾸기

목요일, 3월 19th, 2009

http://k.daum.net/qna/view.html?qid=2d7Pn

image

image

내용을 그대로 복사합니다
다른위치에 오셔서 마우스 오른쪽 버튼을 누르고
선택하여 붙여넣기를 실행합니다
대화상자 아랫쪽에 행/열 바꿈을 선택하고 확인을 클릭합니다

Date로 시간 세팅

목요일, 3월 19th, 2009

date “+%Y%m%d %T”

하면

20090319 07:20:25

이런 식으로 나옵니다.

한 서버에서 이렇게 프린트한 다음,

이걸 복사해다가

다른 서버에

date “+%Y%m%d %T” -s “20090319 07:20:25″

해주면 그 시간으로 세팅됩니다.

netcat으로 원격 실행

목요일, 3월 19th, 2009

신뢰하는 시스템간에서 간단하게 원격 명령을 시키고 싶을 때

(저는 임베디드 보드랑 호스트의 경우였습니다)

호스트에서 스크립트로 명령어를 전송하면 타겟에서 실행하게 하고 싶었어요

 

nc를 사용했습니다.

타겟은 서버가 되고 호스트는 클라이언트가 됩니다.

서버(타겟)

서버 스크립트 (/root/ncsrv_daniel.sh)

#!/bin/sh
while true
do
echo starting new nc session
nc -v -l -p 1234 -e /bin/sh
done

shell 을 띄우도록 설정.

타겟의 프롬프트에서 해당 스크립트 실행

 

클라이언트(호스트)

호스트 스크립트

echo ./remCmd.sh\;exit | nc 192.168.1.111 1234[1]

nc로 접속한다음 ./remCmd.sh;exit를 입력하도록 함.

remCmd.sh가 원격으로 타겟에서 실행하고자 하는 프로그램. 타겟의 /root/에 있음.

 

테스트 스크립트 (nctest.sh)

#!/bin/bash

ok_count=0
fail_count=0

for i in `seq 1 100`;     100번 반복 테스트.
do
echo ${i}th run…
echo ./remCmd.sh\;exit | nc 192.168.1.111 1234
result=$?
echo done ${i}th run. return $result
if [ $result -eq 0 ] ;
then
((ok_count++))
else
((fail_count++))
fi
sleep 1      종료후 nc 서버가 다시 뜨는 데 시간이 걸려서 기다려줌.
done
echo OK: $ok_count
echo FAIL: $fail_count


[1] 또는

nc 192.168.1.111 1234 –c “echo ./remCmd.sh\;exit” (또는 적절한 스크립트)

를 실행해도 될 것임. (테스트해보진 않았음)

프로그래머 복음 - 그중에 제일은 게으름이라.

토요일, 3월 14th, 2009

http://theonion.egloos.com/4873796

딱 제얘기네요.

한때 다녔던 회사에서 나오기 직전 MBTI검사에서 나왔던 결과 ISTP - 도구 중심형. 파일럿등의, 도구를 엘레강트하게 사용할 수 있음에서 희열을 느낀다.

bash 스크립트로 할 수 있는 여러가지 일들을 실험해보고 cvs, svn, apache, wiki, viewcvs등등을 만지며 버전관리 시스템을 정착시키고 (예를들어 이메일로 로그날리는 시스템을 만들고 패치 포스팅 한다든지..)

vim+cscope+ctags on cygwin으로 남들이 다 윈도에서 커맨드창으로 하는 빌드를 cygwin+ssh에서 make로 돌리고 스크립트로 만들어지는 이미지 버전넘버 만들어 붙이기 놀이 (- 물론 도움이 됐죠 당근. 버전이 얼마나 중요한데. 돌고 안도는 거 확인하기.)

그리고 다음 회사에서도 QA 테스트를 모조리 bash 스크립트로 하려는 삽질 - 지상파 DMB 수신되는지 확인을 그걸로 했죠. DMB칩 개발이었음.

등등.. 도구를 잘쓰면 왜이리 기분이 좋은지..

그러면서 삽질의 내공은 늘어가고, 하루종일 한 것은 스크립트 몇개 만들어 수백 수천번 돌려본 일인 날이 부지기수…

 

 

딴짓과 삽질과 게으름은
이세상 끝까지 영원하며
그 중에 제일은 게으름이라.

 

1. 할 일이 있다. 두 시간이면 끝난다.
2. 당신이 진실한 프로그래머라면 그냥 바로 한 번 하고 끝내지 않는다. (=> 게으름)
3. 이 하기 싫은 일을 또 해야 할지도 모른다는 생각에, 이걸 어떻게 해서 스크립트로 쓸까 생각한다. 혹은 다른 괜찮은 툴이 있나, 라이브러리가 있나 뒤져본다. (=>딴짓 + 게으름)
4. 몇 시간 동안 뒤지며 시간을 낭비한다. (=>딴짓과 삽질)
5. 하루가 끝났다. 하루 종일 열라 열심히 일한 거 같은데 아니다. (=> 삽질)
6. 하라는 일은 안했지만 오픈소스 xxx 툴에 대해서 아주 잘 알게 됐다. (=> 딴짓 + 게으름)

사랑하는 이가

월요일, 3월 9th, 2009

사랑하는 이가
곁에 없으면
세상은
어디를가도
무인도

-이외수

TOEIC speaking, OPIc, 텝스 환산

화요일, 3월 3rd, 2009

대기업 입사시험에서 쓰는 영어 말하기 점수 : OPIcTOEIC을 많이 쓴다.

예를 들어 삼성의 경우

image

 

경영지원직

OPIC  :  IL

TOEIC SPEAKING : 5급

기술직

OPIc : NH

TOEIC Speaking : 4급

이다.

image

image

 

예를 들어 TEPS의 환산표가 다음과 같으므로

image

텝스 826점이라면 토익 895점이고 speaking 레벨은 7에서 하급정도 될 것이다.

gizmosms 해외에 문자보내기

월요일, 3월 2nd, 2009

http://www.gizmosms.com/

image

http://paperinz.com/789 에 나온 겁니다.

Gizmo SMS 는 인터넷 웹사이트에서 무료로 문자를 보낼 수 있는 곳이다  재미있는 점은 세계 50여개국에 어떤 핸드폰이든 상관없이 문자를 보낼 수 있다는 점이다  게다가 회원가입도 필요없고 이메일 조차 요구하지 않는다