MS Office Outlook 2003 , 0x80040201 에러.

Computer/ETC 2009. 6. 2. 14:29

아웃룩에서 메일을 보낼 때
알 수 없는 오류가 발생했습니다, (0x80040201) 오류가 발생했다.

대략 4시간여의 삽질 후 결론적으로 원인은 간단한 거 (나는 3번..)였는데...아무튼 중간 중간 찾은 팁들 정리.

이 에러가 발생하는 경우는 다음의 두가지 경우이다.

1. 사용자 프로파일이 깨진 경우
제어판 -> 메일 -> 사용자 프로파일
들어가서 해당 프로파일 삭제 후 재 생성 해본다.

2. 개인파일 폴더 및 아웃룩 주소록 애칭 기능 관련 파일이 깨진 경우.

Action 1
           로컬 컴퓨터에서 *.nk2을 검색 후 리네임 합니다.
           아웃룩을 시작하여 현상이 재현 되는 지 확인합니다.
           http://support.microsoft..com/kb/287623/ko

 Action 2
            이와는 별도로 기존에 가지고 계시는 pst파일 검사를 먼저 해 보셔야 될 거 같습니다아래 kb입니다.

http://support.microsoft.com/kb/287497/



3. 받는 사람, 참조 등에 아웃룩에서 해석할 수 없는 메일 주소가 들어간 경우.
예를 들어, 익스체인지 서버와 연동하여 주소를 가져와야 하는 이름이 들어가 있다거나,
등등.
직접 메일 주소를 타이핑 해서 보냈을 때 잘 보내지는지 확인해보면 된다.


해결하느라 뒤졌던 사이트, 링크들..
http://office-outlook.com/outlook-forum/index.php?t=msg&th=39963/
http://www.pcreview.co.uk/forums/thread-1872774.php


PC 1대에서 복수 네트워크 동시에 사용하기

Computer/ETC 2009. 3. 27. 01:00

사실 어찌저찌 하다보면 아래와 같은 상황은 자주 발생한다.
차단된 Network를 우회하기 위해, 아니면 메인 네트워크의 throughput 등에 영향을 주지 않고 특정 네트워크에 대한 테스트를 한다거나....등등등.
향후 3G network, WiBro, 기타 WIFI 등 가능한 모든 interface에 대해 아래와 같이 G/W 변경으로 사용 가능하다.

윈도우에서 복수의 네트워크를 연결하고 나면 default gateway가 변경되어 연결 상태가 원하지 않는 우선순위를 갖게 되는 경우가 있다.
예를 들어,
1. 나는 (사내망) 유선을 메인으로, 무선을 특정 프로그램용으로 사용하고 싶은 경우
2. 유선을 잡은 상태에서 무선을 연결하고 나니,
3. default gateway가 무선의 것으로 바뀌어 사내망 접속이 안된다거나 하는 등의.

이런 경우에는 아래 포스트를 참고하여 default gateway를 변경해준다.
http://geniuskch.tistory.com/entry/Windows에서-default-gateway-값-변경

================================================================================
노트북 PC 에서 유선 랜과 무선 랜을 동시에 사용하게 되면,
(라우팅이나 환경에 따라 다르겠지만) 통상 유선을 이용해서 네트워크를 사용하게 되더군요.

우선 제 의도는 특정 IP 의 경우에만 무선 랜을 이용하고 나머지는 유선 랜을 이용해서 인터넷을 하기 위함
이었습니다. 이유는 아래의 상황 때문이었죠.

1. 상황은 이렇습니다.

유선 네트웍에는 사내 내부망이 연결되어 있고, 무선 네트웍에는 (공개된 AP의) 외부망으로 연결되어 있습니다.

문제는 내부망의 경우 특정 사이트의 접속을 막아 놓은 상태이기 때문에
MSN 메신저와 네이트온을 포함한 여러 메신저 접속 및 그 외 몇몇 사이트에 접근할 수 없었던 거죠.

서버 접속이나 업무를 위해서는 내부망을  반드시 이용할 수 밖에 없는 실정이다 보니,
기존에는 proxy server (HTTP Tunnel, Sconnect 등의 프로그램을 포함해서) 를 이용하는 방법을
사용했습니다.
가정에 proxy server 를 구축해둘 여유도 없고, 기타 위의 프로그램들도 유료이다 보니
(무료로 사용할 때에 Http Tunnel 은 속도가 조금 느릴 수 있는 제약이 있고, Sconnect 는 1일 1시간으로 제한)

아무튼 우연히 사무실에서 무선 네트웍이 (공개된ap) 잡히는 걸 알게 되었고
동시 사용을 시도해 보았으나, 실패.

결국, 내부망 로컬연결 - 사용한함 시켜놓고 무선랜쓰다가 다시 내부망 켜서 작업하고···.
이렇게 수동 ON/OFF 번갈아 가면서 필요할 때에만 무선으로 연결해서 쓰고 했는데 그리 효율적이지도
못하고 해서···.

유선·무선 둘 다 켜놓고 특정 IP 만 무선으로 이용하는 방법을 써서 사용하고 있습니다.

네이버와 구글을 포함해서 각종 검색사이트에 이리저리 검색해봤지만, 제가 원하는 답은
찾을 수 없더군요. 다만 비슷한 답들을 힌트로 -_-;

원리는, 라우팅 테이블을 건드려서 해당 IP 의 게이트웨이를 바꿔주는 방식인데,
말은 좀 어려운 것 같은데 해보면 간단합니다.


2. 의도

내부망으로는 업무/서버접속등을 위해 사용하고, 무선랜으로는 메신저 및 특정 사이트를
이용합니다.


3. 필요한 것

한대의 PC 와 두 개 이상의 네트워크.
- 이 글에서는 특정 사이트가 차단되어 있는 내부망 랜과 그외 무선 외부망을 기준으로 설명하고 있음.


4. 방법

    1) 2 개의 네트워크를 연결해 둡니다.

    2) 콘솔창을 띄우고, route print 명령으로 해당 Gateway 의 Metric 을 확인해 둠
      여기서 해당 Gateway 란 특정 사이트를 이용할 네트웍의 Gateway 를 말합니다.
       제 경우는, 내부망에서는 특정 차단된 사이트를 이용할 무선랜의 Gateway 가 해당됨.

            C:\ 콘솔> route print


    3) route add 명령을 이용해서 접속할 사이트를, 해당 Gateway 로 지정하는 명령을 실행해 줍니다.

            C:\ 콘솔> route add 명령 [접속할 사이트의 IP] [사용할 Gateway] [해당 metric]

   
    ※ route 명령만으로 실행하면 각종 도움말을 얻을 수 있음.

     4) route print 명령 또는 netstat -nr 명령으로 확인합니다.

    끝입니다.

이렇게 하면 route add 명령으로, 무선랜의 게이트웨이는 특정의 IP 만을 이용하게 되는 거죠.

하나의 예를 들어 보면, 내부망이 아닌 무선랜으로 네이트온을 접속할 경우에는

C:\ 콘솔> route add 203.226.253.91 192.168.1.1 METRIC 25
C:\ 콘솔> route add 203.226.253.73 192.168.1.1 METRIC 25


명령으로 가능하게 됩니다. (앞의 주소는 네이트온, 뒤에는 무선 게이트웨이)

참조 ) 네이트온 접속 주소

MSN 메신저의 경우는 이용 포트번호 말고도, 유동적으로 터널링되는 주소가 바뀌기 때문에
특정하기가 좀 어려워서 접속시마다 추가해 줬더니 약 20개 정도의 주소나 이용되어지더군요. -_-;

아참, 덤으로 이용되어지는 IP 주소를 알기 위해서는 netstat -na 명령으로 검색하면 됩니다.

================================================================================

위에 언급된 바와 같이 네트워크상의 특정 프로그램이 사용하고 있는 IP, port등을 알기 위해서는 netstat -an 명령을 이용하면 된다.


command 창에서 명령 수행 후

 TCP    172.21.29.246:1807     192.168.13.30:443      ESTABLISHED

요런 형태의 'ESTABLISHED' 상태의 연결들이 그것들이다.


출처: http://kongmks.cafe24.com/255?TSSESSION=67b637ce36321a49433071bc2dd63289

Windows에서 default gateway 값 변경.

Computer/ETC 2009. 3. 27. 00:39
Windows에는 Linux와 달리 [route add default gateway ...] 가 없다.
Gateway가 여러개인 경우, default를 변경하기 위해서 다음과 같이 수행한다.


  • route add 0.0.0.0 mask 0.0.0.0 <default gateway ip address> metric <현재 default gateway보다 작은 값>
  • route add default ... 가 없으므로
  • metric 값을 이용해 routing cost 값을 명시적으로 변경해줘야 한다.
  • 보통 1이 할당되므로 default로 될 놈에 1을 주고 아닌 놈에 5 정도 주면 된다.


출처: http://hohojj.egloos.com/

원격 데스크탑 포트번호 바꾸기

Computer/ETC 2008. 11. 24. 20:36
원격 데스크탑 포트번호 바꾸기

방화벽 등의 이유로 원격데스크탑(터미널 서비스)의 디폴트 포트(3389)로
외부에서 원격데스크탑 연결을 열수 없을 경우 아래와 같이 포트 번호를
바꾸면 지정한 포트번호로 연결할 수 있습니다.

1. Regedit 실행

2. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer\
Wds\rdpwd\Tds\tcp

이름 : PortNumber
종류 : REG_DWORD
데이터 : 0x00000d3d(3389)

10진수를 선택하고 다른 포트번호를 입력

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer\
WinStations\RDP-Tcp

이름 : PortNumber
종류 : REG_DWORD
데이터 : 0x00000d3d(3389)

10진수를 선택하고 다른 포트번호를 입력

이렇게 포트가 변경된 원격 데스크탑에 연결할 경우 aaa.bbb.ccc:8080 과 같이
컴퓨터 주소 뒤에 포트번호를 쓰시고 접속하면 됩니다.

레지스트리 변경후 리부팅해야 적용되는 것 같습니다.
(아니면 터미널 서비스를 restart해도 될 것 같습니다.

자료출처 : http://winbbs.com
원문 : http://winbbs.intizen.com/board/content.asp?db=w2003tip&number=220&gotopage=1

아웃룩에서 "보안상 안전하지 않을 수 있으므로 다음 첨부 파일에 액세스할 수 없도록 막았습니다"

Computer/ETC 2008. 5. 9. 11:45
요약
아웃룩 2002 버전에서 메시지에 첨부된 EXE, COM, BAT 등의 파일을 열 수 없습니다.
참고적으로, 이 현상은 아웃룩 2002 버전뿐만 아니라 보안 업데이트 프로그램이 설치된 아웃룩 98/2000 버전에서도 동일합니다.

현상
"보안상 안전하지 않을 수 있으므로 다음 첨부 파일에 액세스할 수 없도록 막았습니다."

원인
이 현상은 아웃룩 2002 버전의 강화된 보안으로 인해 바이러스를 감염시킬 가능성이 있는 일부 파일 형식은
기본적으로 열 수 없도록 되었기 때문입니다.

해결 방법
다음의 방법은 아웃룩 2002 버전에만 적용됩니다.
레지스트리를 편집할 경우 주의를 요합니다.
아웃룩 2002에서 EXE와 BAT 등의 파일을 열 수 있도록 하려면 다음과 같이 레지스트리를 변경해 주어야 합니다.
이 자료는 Exchange Server가 없는 환경에서 혹은 Exchange Server가 있더라도 아웃룩 클라이언트만으로 EXE, BAT와 같은 일부 파일 형식을 열 수 있도록 작업하는 방법을 설명합니다.

1. 아웃룩2002를 종료합니다.

2. 레지스트리 편집기를 실행합니다.
HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Outlook\Security키를 선택합니다.  

3. Security 키를 선택한 상태에서 [편집]-[새로 만들기]-[문자열 값]을 선택하여 이름은 Level1Remove로 입력합니다.
(대소문자 주의)  

4. Level1Remove를 더블클릭하여 [값 데이터]에 다음과 같이 입력합니다.
예) EXE;BAT

즉, Level1에 포함된 확장명 중 아웃룩에서 열 수 있도록 하려는 파일 확장명을 점(.) 없이 확장자 이름만 세미콜론(;)으로 구분하여 입력합니다.  

5. 레지스트리 편집기를 닫고 아웃룩을 실행하여 EXE나 BAT가 첨부된 메일을 열어서 파일을 열어봅니다.

추가 정보
레지스트리를 수정하여 EXE, BAT 등의 파일을 열 수 있도록 한 컴퓨터는 바이러스 감염등의 문제점에 취약할 수 있으므로 각별한 주의를 요합니다.

--------------------------------------------------------------------------------

본 문서의 정보는 다음의 제품에 적용됩니다.
• Microsoft Outlook 2002 Standard Edition

출처: http://web.joinc.co.kr/zb/zboard.php?id=windows&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=reg_date&desc=asc&no=23

'Computer > ETC' 카테고리의 다른 글

Windows에서 default gateway 값 변경.  (0) 2009.03.27
원격 데스크탑 포트번호 바꾸기  (3) 2008.11.24
[MySql]is not allowed to connect to this MySQL server  (0) 2007.08.24
mysql , C 연동.  (4) 2007.07.25
Windows batch programming  (0) 2007.07.16

grep 사용법

Computer/Linux Tips 2007. 9. 27. 20:45

리눅스 명령어들은 안쓰면 자꾸 까먹고 또 까먹고 또 까먹고....

출처: http://tong.nate.com/happylifemini/24685811

출처 : 유닉스 쉘 바이블 (엘리 퀴클리 지음)에서 발췌.
3.1 grep 명령어

grep : 파일 전체를 뒤져 정규표현식에 대응하는 모든 행들을 출력한다.
egrep : grep의 확장판으로, 추가 정규표현식 메타문자들을 지원한다.
fgrep : fixed grep 이나 fast grep으로 불리며, 모든 문자를 문자 그래도 취급한다. 즉, 정규표현식의 메타문자도 일반 문자로 취급한다.

3.2 정규표현식을 사용하는 grep의 예제
# grep NW datafile
# grep NW d* (d로 시작하는 모든 파일에서 NW를 포함하는 모든 행을 찾는다.)
# grep '^n' datafile (n으로 시작하는 모든 행을 출력한다.)
# grep '4$' datafile (4로 끝나는 모든 행을 출력한다.)
# grep TB Savage datafile (TB만 인자이고 Savage와 datafile은 파일 이름이다.)
# grep 'TB Savage' datafile (TB Savage를 포함하는 모든 행을 출력한다.)
# grep '5.' datafile (숫자 5, 마침표, 임의의 한 문자가 순서대로 나타나는 문자열이 포함된 행을 출력한다.)
# grep '.5' datafile (.5가 나오는 모든 행을 출력한다.)
# grep '^[we]' datafile (w나 e로 시작하는 모든 행을 출력한다.)
# grep '[^0-9]' datafile (숫자가 아닌 문자를 하나라도 포함하는 모든 행을 출력한다.)
# grep '[A-Z][A-Z] [A-Z]' datafile (대문자 2개와 공백 1개, 그리고 대문자 하나가 연이어 나오는 문자열이 포함된 행을 출력한다.)
# grep 'ss* ' datafile (s가 한 번 나오고, 다시 s가 0번 또는 여러번 나온 후에 공백이 연이어 등장하는 문자열을 포함한 모든 행을 출력한다.)
# grep '[a-z]{9}' datafile (소문자가 9번 이상 반복되는 문자열을 포함하는 모든 행을 출력한다.)
# grep '(3).[0-9].*1 *1' datafile (숫자 3,마침표,임의의 한 숫자,임의 개수의 문자,숫자 3(태그),임의 개수의 탭 문자,숫자 3의 순서를 갖는 문자열이 포한된 모든 행을 출력한다.)
# grep '(north로 시작하는 단어가 포함된 모든 행을 출력한다.)
# grep '' datafile (north라는 단어가 포함된 모든 행을 출력한다.)
# grep '<[a-z].*n>' datafile (소문자 하나로 시작하고, 이어서 임의 개수의 여러 문자가 나오며, n으로 끝나는 단어가 포함된 모든 행을 출력한다. 여기서 .*는 공백을 포함한 임의의 문자들을 의미한다.)

3.3 grep에 옵션 사용
# grep -n '^south' datafile (행번호를 함께 출력한다.)
# grep -i 'pat' datafile (대소문자를 구별하지 않게 한다.)
# grep -v 'Suan Chin' datafile (문자열 Suan Chin이 포함되지 않은 모든 행을 출력하게 한다. 이 옵션은 입력 파일에서 특정 내용의 입력을 삭제하는데 쓰인다.
# grep -v 'Suan Chin' datafile > black
# mv black datafile
# grep -l 'SE' * (패턴이 찾아진 파일의 행 번호 대신 단지 파일이름만 출력한다.)
# grep -w 'north' datafile (패턴이 다른 단어의 일부가 아닌 하나의 단어가 되는 경우만 찾는다. northwest나 northeast 등의 단어가 아니라, north라는 단어가 포함된 행만 출력한다.)
# grep -i "$LOGNAME" datafile (환경변수인 LOGNAME의 값을 가진 모든 행을 출력한다. 변수가 큰따옴표로 둘러싸여 있는 경우, 쉘은 변수의 값으로 치환한다. 작은따옴표로 둘러싸여 있으면 변수 치환이 일어나지 않고 그냥 $LOGNAME 이라는 문자로 출력된다.)

3.4 egrep
egrep(extended grep) : grep에서 제공하지 않는 확장된 정규표현식 메타문자를 지원  한다. grep와 동일한 명령행 옵션을 지원한다.

3.4.1 egrep 예제
# egrep 'NW|EA' datafile (NW나 EA가 포함된 행을 출력한다.)
# egrep '3+' datafile (숫자 3이 한 번 이상 등장하는 행을 출력한다.)
# egrep '2.?[0-9]' datafile (숫자 2 다음에 마침표가 없거나 한 번 나오고, 다시 숫자가 오는 행을 출력한다.)
# egrep ' (no)+' datafile (패턴 no가 한 번 이상 연속해서 나오는 행을 출력한다.)
# egrep 'S(h|u)' datafile (문자 S 다음에 h나 u가 나오는 행을 출력한다.)
# egrep 'Sh|u' datafile (패턴 Sh나 u를 포함한 행을 출력한다.)

3.5 고정 grep 과 빠른 grep
fgrep : grep 명령어와 동일하게 동작한다. 다만 정규표현식 메타문자들을 특별하게 취급하지 않는다.
# fgrep '[A-Z]****[0-9]..$5.00' file ([A-Z]****[0-9]..$5.00 이 포함된 행을 출력한다. 모든 문자들을 문자 자체로만 취급한다.)

출처 : Tong - Happy Life님의 System Information통

gdb 명령어 요약집

Computer/C/C++ 2007. 9. 20. 19:46
- 출처: http://hongten.egloos.com/416241

1. 우선 컴파일 시에 디버깅 정보를 담아야 한다.
gcc -g -o [프로그램명] [소스파일명]
디버깅 옵션인 -g 으로 컴파일하며, 최적화 옵션인 -O 은 주지 않도록 한다.

2. 실행방법
gdb [프로그램명]
gdb [프로그램명] [core파일명]
gdb [프로그램명] [실행중인프로세스pid]

3. 종료방법
q
Ctrl + d

4. 소스 찾아가기 (list)
l : main 함수를 기점으로 소스의 내용이 출력된다
l 10 : 10 행 주변의 소스가 출력되는데 10 - 5 행부터 10 + 5행까지 총 10행이 출려된다.
l func : func 함수의 소스를 출력
l -5 : 기본값으로 10줄이 출력된다고 가정하고, 다음에 출력될 라인이 11라인이라면, 10(마지막라인) - 5 라인을 중심으로 출력된다. 즉, 그대로 1~10라인이 출력된다.
l a.c:func : a.c 파일의 func 함수부분을 출력
l a.c:10 : a.c 파일의 10행을 기준으로 출력

5. 옵션
set listsize 20 : 한번에 출력하는 행의 갯수를 20개로 늘린다.
Enter : 마지막으로 수행한 명령어를 다시 수행한다

6. 프로그램 실행, 종료 (run, kill)
r : 프로그램 수행 (재시작)
r arg1 arg2 : arg1과 arg2를 인자로 프로그램 수행
k : 프로그램 수행종료

7. 역추적하기 (backtrace)
bt : 오류가 발생한 함수를 역으로 찾아간다.

8. 중단점 사용하기 (breakpoint, temporary breakpoint)
b func : func 함수에 브레이크 포인트 설정
b 10 : 10행에 브레이크 포인트 설정
b a.c:func : a.c파일의 func함수에 브레이크 포인트 설정
b a.c:10 : a.c파일의 10행에 브레이크 포인트 설정
b +2 : 현재 행에서 2개 행 이후 지점에 브레이크 포인트 설정
b -2 : 현재 행에서 2개 행 이전 지점에 브레이크 포인트 설정
b *0x8049000 : 0x8049000 주소에 브레이크 포인트 설정 (어셈블리로 디버깅 시 사용)
b 10 if var == 0 : 10행에 브레이크 포인트를 설정해되, var 변수 값이 0일 때 작동
tb : 임시 중단점을 사용하는 것으로 한번만 설정되며, 그 이후에는 삭제된다.

9. 중단점 설정하기 (condition)
condition 2 var == 0 : 고유번호가 2번인 브레이크포인트에 var변수가 0일 때 동작하라고 설정

10. 중단점 삭제하기 (clear, delete)
cl func : func 함수의 시작 부분에 브레이크 포인트 지움
cl 10 : 10행의 브레이크 포인트 지움
delete 1 : 고유번호 1번의 브레이크 포인트를 지운
cl a.c:func : a.c 파일의 func함수의 브레이크 포인트 지움
cl a.c:10 : a.c 파일의 10행의 브레이크 포인트 지움
cl : 모든 브레이크 포인트 지움

11. 중단점 정보보기 (information)
info b : 현재 설정된 브레이크 포인트의 정보를 보여준다
방향키Up/Down : 방향키 Up/Down을 누르면 히스토리 기능을 제공한다
info br + TAB : info br 로 시작하는 키워드가 히스토리에 있다면 뿌려준다
info TAB + TAB : info 뒤에 올 수 있는 인자 리스트를 보여준다
TAB + TAB : 현재 사용가능한 모든 명령어 리스트를 보여준다

12. 중단점 비활성화, 활성화 하기 (enable, disable)
disable 2 : 고유번호 2번인 브레이크 포인트 비활성화
enable 2 : 고유번호 2번인 브레이크 포인트 활성화

13. 디버깅 하기 (step, next, continue, until, finish, return, step instruction, next instruction)
s : 현재 출력된 행을 수행하고 멈추지만, 함수의 경우 함수의 내부로 들어가서 수행된다
s 5 : s를 5번 입력한 것과 동일
n : 현재 행을 수행하고 멈추지만, 함수의 경우 함수를 수행하고 넘어간다
n 5 : n을 5번 입력한 것과 동일
c : 다음 브레이크 포인트를 만날때 까지 계속 수행한다
u : for 문에서 빠져나와서 다음 브레이크 포인트까지 수행한다.
finish : 현재 함수를 수행하고 빠져나감
return : 현재 함수를 수행하지 않고 빠져나감
return 123 : 현재 함수를 수행하지 않고 빠져나감, 단, 리턴값은 123
si : 현재의 인스트럭션을 수행, 함수 호출 시 내부로 들어간다.
ni : 현재의 인스트럭션을 수행, 함수 호출 시 내부로 들어가지 않는다.

14. 감시점 설정 (watch)
watch i : i변수에 와치포인트를 설정하고 i변수가 바뀔 때마다 브레이크가 걸리면서 이전값과 현재값을 출력한다.

15. 변수 정보보기 (info, print)
info locals : 현재 상태에서 어떤 지역변수들이 있으며, 값은 어떠한지를 알 수 있다.
info variables : 현재 상태에서의 전역변수 리스트를 확인할 수 있다.
p lval : lval 값을 확인한다.
p func : func 함수의 주소값을 확인한다.
p pt : pt가 구조체라면 구조체의 주소를 확인한다
p *pt : pt가 구조체라면 구조체의 값을 확인한다.
p **pt : *pt가 구조체라면 구조체의 값을 확인한다.
info registers : 레지스트 값 전체를 한번에 확인한다.

16. 레지스트 값 및 포인터가 가리키는 구조체의 배열을 출력 (info, print)
info all-registers : MMX 레지스트를포함하여 거의 대부분의 레지스트 값을 확인한다.
p $eax : eax 레지스트의 값을 확인한다. ( ex_ eax, ebx, ecx, edx, eip )
p *pt@4 : 4크기의 배열로 gdb가 알 수 있으므로 4개의 크기만큼 가져와서 확인할 수 있다.

17. 중복된 변수명이 있는 경우 특정 변수를 지정해서 출력 (print)
p 'main.c'::var : main.c 파일에 있는 전역변수인 var 변수의 값을 출력
p hello::var : hello 함수에 포함된 static 변수인 var 변수의 값을 출력

18. 출력 형식의 지정
p/t var : var 변수를 2진수로 출력
p/o var : var 변수를 8진수로 출력
p/d var : var 변수를 부호가 있는 10진수로 출력 (int)
p/u var : var 변수를 부호가 없는 10진수로 출력 (unsigned int)
p/x var : var 변수를 16진수로 출력
p/c var : var 변수를 최초 1바이트 값을 문자형으로 출력
p/f var : var 변수를 부동 소수점 값 형식으로 출력
p/a addr : addr주소와 가장 가까운 심볼의 오프셋을 출력 ( ex_ main + 15 )

19. 타입이 틀릴 경우 타입을 변환하여 출력
p (char*)vstr : 실제 컴파일 시에 (void *)형으로 되어있었다고 하더라도 (char *)로 캐스팅 하여 보여줌

20. 특정한 위치 지정
p lstr + 4 : 예를 들어 lstr = "I like you." 라는 문자열은 "ke you."가 출력된다.

21. 변수 값 설정
p lval = 1000 : 변수값 확인 이외에는 설정도 가능하다.

22. 출력명령 요약 (print)
p [변수명] : 변수 값을 출력
p [함수명] : 함수의 주소를 출력
p/[출력형식] [변수명] : 변수 값을 출력 형식으로 출력
p '[파일명]'::[변수명] : 파일명에 있는 전역변수 값을 출력
p [함수명]::[변수명] : 함수에 있는 변수 값을 출력
p [변수명]@[배열크기] : 변수의 내용을 변수 배열의 크기 형태로 출력

23. 디스플레이 명령 (display, undisplay)
display [변수명] : 변수 값을 매번 화면에 디스플레이
display/[출력형식] [변수명] : 변수 값을 출력 형식으로 디스플레이
undisplay [디스플레이번호] : 디스플레이 설정을 없앤다
disable display [디스플레이번호] : 디스플레이를 일시 중단한다.
enable display [디스플레이번호] : 디스플레이를 다시 활성화한다.

24. 스택이란
스택의 경우는 상위 1기가는 커널에서 사용하며, 그 바로 아래 공간인 상위 0xBFFFFFFF 부터 하위로 늘어나게된다.
상세한 디버깅을 위해서는 -g 옵션으로 디버깅 정보와 --save-temps 옵션을 통해 어셈블리 코드를 얻어낼 수 있다.
상위 프레임으로 갈 수록 메인 함수에 가까워 지는 것이다.

25. 스택 프레임 관련 명령 (frame, up, down, info)
frame [N] : n번 스택 프레임으로 변경
up : 상위 프레임으로 이동
up [N] : n번 상위 스택 프레임으로 이동
down : 하위 프레임으로 이동
down [N] : n번 하위 스택 프레임으로 이동
info frame : 현재 스택 프레임 정보를 출력
info args : 현재 스택 프레임의 함수가 호출될 때 인자를 출력
info locals : 현재 스택 프레임의 함수내의 지역변수를 출력
info catch : 현재 스택 프레임의 함수내의 예외 핸들러를 출력

26. 스택 트레이스 하는법
b main 또는 원하는 곳에 브레이크 포인트를 잡고
오류가 발생할 때 까지 c를 통해 진행하면, 세그먼트 폴트 등의 오류가 발생하고 디버그가 멈추는데
여기서 bt 를 통해서 전체 스택 프레임을 확인하고 어떤 함수에서 호출시에 문제가 발생하였는지 확인
단, 일반적인 라이브러리에서는 오류발생 확률이 없다고 보고, 그 함수를 호출시에 문제를 의심한다.
다시 프레임을 이동하면서, 로컬변수와 전역변수 등을 확인하면서 디버깅이 가능하다.

27. 메모리 상태 검사 (x)
x/[범위][출력 형식][범위의 단위] : 메모리의 특정 범위의 값들을 확인할 수 있다.
이렇게 메모리를 직접 읽어보는 일은 -g 옵션을 가지고 컴파일 되지 않은 실행파일을 디버깅 할때에 자주 사용된다.
즉, x/10i main 과 같이 역 어셈블하여 해당 코드를 추측하는 것이다.

28. 출력형식
x/10 main : main 함수 시작부터 40바이트를 출력한다. 출력형식은 다음과 같다.
x/10t main : main 함수 시작부터 40바이트를 2진수로 출력
x/10o main : main 함수 시작부터 40바이트를 8진수로 출력
x/10d main : main 함수 시작부터 40바이트를 부호가 있는 10진수로 출력 (int)
x/10u main : main 함수 시작부터 40바이트를 부호가 없는 10진수로 출력 (unsigned int)
x/10x main : main 함수 시작부터 40바이트를 16진수로 출력
x/10c main : main 함수 시작부터 40바이트를 최초 1바이트 값을 문자형으로 출력
x/10f main : main 함수 시작부터 40바이트를 부동 소수점 값 형식으로 출력
x/10a main : 가장 가까운 심볼의 오프셋을 출력
x/10s main : 문자열로 출력
x/10i main : 어셈블리 형식으로 출력

29. 범위의 단위 (기본 word - 4바이트)
x/10b main : byte - 1바이트 단위 - 10바이트 출력
x/10h main : halfword - 2바이트 단위 - 20바이트 출력
x/10w main : word - 4바이트 단위 - 40바이트 출력
x/10g main : giant word - 8바이트 단위 - 80바이트 출력

30. 디스어셈블링 (disas)
disas func : 어셈블리 코드를 좀 보편적으로 보기 위한 명령어
disas 0x8048300 0x8048400 : 특정 주소 범위사이의 어셈블리 코드를 보기

31. 함수호출 (call)
call func(arg1, arg2) : 특정함수 func를 arg1, arg2 파라메터를 포함하여 호출하고, 반환값은 출력

32. 점프 (jump)
jump *0x08048321 : 해당 주소로 무조건 분기하여 인스트럭션을 계속 수행한다.
jump 10 : 무조건 10행으로 분기하여 수행한다.
jump func : func 함수로 무조건 분기하여 수행한다.

33. 시그널 전송 (signal)
info signals : 보낼 수 있는 시그널의 종류를 확인할 수 있다.
signal SIGKILL : 디버깅 대상의 프로세스에게 KILL 시그널을 보낼 수 있다.

34. 메모리의 특정 영역에 값을 설정 ( set )
set {타입}[주소] = [값] : p 명령 대신에 set 을 통해서 메모리의 특정 주소에 저장하는 것이 더 일반적이다
set {int}0x8048300 = 100 : 해당 주소에 100의 값을 입력한다.

35. gdb 환경설정 (set)
info set : 변경 가능한 환경설정 정보를 출력한다.
info functions : 함수들의 리스트를 출력
info types : 선언된 타입에 대한 리스트를 출력
set prompt psyoblade: : 프롬프트를 psyoblade: 로 변경할 수 있다.
set print array on : 배열을 출력할 때 한 행에 출력하는 것이 아니라 여러 행에 출력한다.

36. 기타 info 를 통해 알 수 있는 정보들
address catch extensions handle objects set stack tracepoints
all-registers common files heap program sharedlibrary symbol types
architecture copying float leaks registers signals target variables
args dcache frame line remote-process source terminal warranty
breakpoints display functions locals scope sources threads watchpoints

--

'Computer > C/C++' 카테고리의 다른 글

stringstream  (3) 2007.08.09
#define을 통한 macro에서 #과 ##의 용법  (0) 2007.08.08
#pragma  (0) 2007.08.08
vprintf, vsprintf,... 가변 인수 함수.  (0) 2007.08.01
bitset 클래스  (0) 2007.07.02

[MySql]is not allowed to connect to this MySQL server

Computer/ETC 2007. 8. 24. 14:07
출처: http://blog.naver.com/ddak2ya?Redirect=Log&logNo=30004371547

Trouble Shooting -
Error MSG: Host 'XXX' is not allowed to connect to this MySQL server


Host 'mcr-tf3c16x72pp' is not allowed to connect to this MySQL server
localhost로는 접속이 가능하고 IP로는 접속이 불가능한 이유는 접속가능한 IP로 등록이 되어 있지 않기 때문입니다.

select * from mysql.user

로 보시면 localhost는 보이나 IP는 보이지 않을것입니다.

mysql> grant all privileges on db명.* to 사용자계정@'IP주소'
identified by '비밀번호' with grant option;
mysql> grant reload,process on *.* to admin@localhost;
mysql> FLUSH PRIVILEGES;

위의 명령어로 접속가능한 IP로 등록해 주면됩니다.

stringstream

Computer/C/C++ 2007. 8. 9. 22:17
재미있는 녀석을 발견했다.


stringstream 이라는 녀석...

출처: http://blog.empas.com/electr/19358611

1.요약

문자열을 스트림처럼 다룰 수 있습니다.
sprintf/wsprintf의 대용으로 사용할 수도 있고, 문자열에서 토큰을 꺼내오는 데도 사용할 수 있습니다.


2.본문

C++에서 표준 입출력을 나타내는 cin/cout을 사용해 보신 적이 있으실 겁니다. stringstream도 같은 인터페이스를 가지고 있습니다.
대신에 문자열을 상대로 입출력을 한다고 생각하시면 되죠.

예제를 우선 보시겠습니다.

----- stringstream을 사용한 예제 --------------------------

1 

2 

3    #include <sstream> 

4    #include <iostream> 

5     

6    int main(int argc, char* argv[]) 

7    { 

8        int n = 3571; 

9        char* p = "blue"; 

10     

11        std::stringstream s; 

12        s << " My favorite color is " << p << "nand my favorite number is " << n; 

13     

14        std::cout << "Sentence----------------------n"; 

15        std::cout << s.str() << std::endl; 

16     

17        std::cout << "nToken-------------------------n"; 

18     

19        while(1) 

20        { 

21            char c[100]; 

22     

23            s >> c; 

24            if( s.fail() ) 

25                break; 

26     

27            std::cout << c << "n"; 

28        } 

29     

30        std::cout.flush(); 

31     

32        return 0; 

33    } 

---- 실행 결과 -------------------------------------------------

Sentence---------------------
My favorite color is blue
and my favorite number is 357

Token------------------------
My
favorite
color
is
blue
and
my
favorite
number
is
3571

-- 예제 분석 -----------------------------------------------

3    #include <sstream> 
stringstream 은 sstream 헤더 파일에 정의되어 있습니다.

( 참고로 이번 예제에서는 using namespace std;를 사용하지 않았기 때문에 필요할 때마다 std::를 붙여주어야 합니다. 계속 보시죠)

----------------------------------------------------------

8        int n = 3571; 

9        char* p = "blue"; 

10     

지역 변수를 선언하고 있습니다.
n, p는 나중에 문자열에 집어넣으려고 만든 겁니다.

중요한 stringstream s를 선언하고 있습니다.

----------------------------------------------------------

12        s << " My favorite color is " << p << "nand my favorite number is " << n; 
이번 Tip에서의 첫번째 하이라이트 입니다. MFC의 CArchive를 쓰듯이 s에 문자열 및 숫자를 차곡차곡 넣고 있습니다.

----------------------------------------------------------

15        std::cout << s.str() << std::endl; 
넣었으면 전체 문자열을 얻을 수도 있어야 겠지요.
stringstream::str() 은 string 을 반환합니다.

string은 C++ Standard Library에서 문자열을 다루기 위해 추가된 템플릿 클래스 입니다. string 객체에서 c-style의 문자열을 얻고자 하신다면.

str.c_str(); 
처럼 하시면 됩니다. 필요하실 때 쓰세요.

----------------------------------------------------------

19        while(1) 

20        { 

21            char c[100]; 

22     

23            s >> c; 

24            if( s.fail() ) 

25                break; 

26     

27            std::cout << c << "n"; 

28        } 

문자열의 마지막까지 토큰을 뽑아내려고 while 문으로 루프를 돌리고 있습니다.

이번 Tip의 두 번째 하이라이트인 23 라인에서는

s >> c;
처럼 토큰을 뽑아내고 있습니다.

나머지 코드는 실패여부를 확인하고 화면에 찍어주는 역할을 하므로 설명은 생략하겠습니다.


3.예제



4.참고

The C++ Standard Library from scratch



- 2001.08.13 Smile Seo -

'Computer > C/C++' 카테고리의 다른 글

gdb 명령어 요약집  (0) 2007.09.20
#define을 통한 macro에서 #과 ##의 용법  (0) 2007.08.08
#pragma  (0) 2007.08.08
vprintf, vsprintf,... 가변 인수 함수.  (0) 2007.08.01
bitset 클래스  (0) 2007.07.02

#define을 통한 macro에서 #과 ##의 용법

Computer/C/C++ 2007. 8. 8. 22:52

Stringizing Operator (#)

The number-sign or “stringizing” operator (#) converts macro parameters (after expansion) to string constants. It is used only with macros that take arguments. If it precedes a formal parameter in the macro definition, the actual argument passed by the macro invocation is enclosed in quotation marks and treated as a string literal. The string literal then replaces each occurrence of a combination of the stringizing operator and formal parameter within the macro definition.

White space preceding the first token of the actual argument and following the last token of the actual argument is ignored. Any white space between the tokens in the actual argument is reduced to a single white space in the resulting string literal. Thus, if a comment occurs between two tokens in the actual argument, it is reduced to a single white space. The resulting string literal is automatically concatenated with any adjacent string literals from which it is separated only by white space.

Further, if a character contained in the argument usually requires an escape sequence when used in a string literal (for example, the quotation mark (") or backslash (\) character), the necessary escape backslash is automatically inserted before the character. The following example shows a macro definition that includes the stringizing operator and a main function that invokes the macro:

#define stringer( x ) printf( #x "\n" )

void main()
{
    stringer( In quotes in the printf function call\n ); 
    stringer( "In quotes when printed to the screen"\n );   
    stringer( "This: \"  prints an escaped double quote" );
}

Such invocations would be expanded during preprocessing, producing the following code:

void main()
{
   printf( "In quotes in the printf function call\n" "\n" );
   printf( "\"In quotes when printed to the screen\"\n" "\n" );
   printf( "\"This: \\\" prints an escaped double quote\"" "\n" );
}

When the program is run, screen output for each line is as follows:

In quotes in the printf function call

"In quotes when printed to the screen"

"This: \" prints an escaped double quotation mark"



 

Token-Pasting Operator (##)

The double-number-sign or “token-pasting” operator (##), which is sometimes called the “merging” operator, is used in both object-like and function-like macros. It permits separate tokens to be joined into a single token and therefore cannot be the first or last token in the macro definition.

If a formal parameter in a macro definition is preceded or followed by the token-pasting operator, the formal parameter is immediately replaced by the unexpanded actual argument. Macro expansion is not performed on the argument prior to replacement.

Then, each occurrence of the token-pasting operator in token-string is removed, and the tokens preceding and following it are concatenated. The resulting token must be a valid token. If it is, the token is scanned for possible replacement if it represents a macro name. The identifier represents the name by which the concatenated tokens will be known in the program before replacement. Each token represents a token defined elsewhere, either within the program or on the compiler command line. White space preceding or following the operator is optional.

This example illustrates use of both the stringizing and token-pasting operators in specifying program output:

#define paster( n ) printf( "token" #n " = %d", token##n )
int token9 = 9;

If a macro is called with a numeric argument like

paster( 9 );

the macro yields

printf( "token" "9" " = %d", token9 );

which becomes

printf( "token9 = %d", token9 );


Ref. : MSDN




예를 들어..다양한 이름의 handler들에 대하여 줄줄이 써야할 경우 요런 식의 코드가 가능하다.

#define BEGINHANDLER(PACKET) \
 void PACKET##Handler::executePacket(ACE_SOCK_Stream& peer, Packet* packet) { \  PACKET* thePacket = dynamic_cast<PACKET*>(packet); \
 if ( thePacket == NULL ) throw ("Not a " #PACKET " packet!");

#define ENDHANDLER }
BEGINHANDLER(MPacketQueryResult)
{
 QueryManager::theQueryManager->queryResult(thePacket->getQueryID(), thePacket->getQueryResult(), thePacket->isRowEnd(), thePacket->isEnd());
}
ENDHANDLER

'Computer > C/C++' 카테고리의 다른 글

gdb 명령어 요약집  (0) 2007.09.20
stringstream  (3) 2007.08.09
#pragma  (0) 2007.08.08
vprintf, vsprintf,... 가변 인수 함수.  (0) 2007.08.01
bitset 클래스  (0) 2007.07.02