우분투 12.04 64비트에서 gdb 사용 시 다음과 같은 에러가 발생하였다.


(gdb) r

Starting program: /path/to/home/foo

[Thread debugging using libthread_db enabled]

Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Cannot find new threads: generic error


검색 결과 아래 링크에서 해결방법을 찾았다.

http://stackoverflow.com/questions/2702628/gdb-cannot-find-new-threads-generic-error


정리를 하자면 몇가지 방법이 있지만

로그인한 유저의 홈디렉터리에 ".gdbinit" 파일을 만들고, 64비트일 경우 아래 내용을 넣어준다.


$ cat .gdbinit 

set env LD_PRELOAD /lib/x86_64-linux-gnu/libpthread.so.0


32비트이면 libpthread.so.0경로를 /lib/libpthread.so.0로 변경해준다.

Posted by dcmru
,

CentOS에 Kdevelop V3.3.4를 설치하여 사용중인데,

이번 프로젝트 파일이 이상한 것인지 키입력 시 Kdevelop가 계속 응답을 하지 않는 증상이 나타났다.

지레짐작으로 키입력이 문제라고 판단하여 증상을 해결하려고 호스트의 로케일도 변경해보고,

에디터의 인코딩도 바꿔보고 했지만 문제를 해결할 수 없었다.

결국 예전에 설치한 현 버전보다 낮은 버전의 Kdevelop에서 프로젝트를 불러 작업을 하였으나 같은 증상이 나타났다.

도대체 뭐가 문제인것인지 알수가 없다.

V3.3.4 버전이 나온지 오래되었고, V4를 예전에 설치해봤으나 V3과 너무 달라 사용을 포기한적이 있다.

 

결국 다른 IDE를 물색하게 되었다.

http://kldp.org/node/129269 링크와 같이 비슷한 고민을 하는 사람들도 보이고, 일단 뭐를 써볼까 고민을 하였다.

 

얼마전 수업시간에 교수님께서 에디터를 뭐를 쓰냐고 물어보신 적이 있다.

다들 자기가 쓰고 있는 프로그램 이름을 말하였는데,

교수님께서 예전에 유학시절 일화를 얘기해 주셨다.

너무 옛날이라 유닉스를 접해보신적이 없으셨던지라 vi를 간신히 쓰고 계셨다는데,

그 학교 교수님이 그러시더란다, 아직도 vi를 쓰냐고,,, emacs를 사용하라는 말씀이시더란다.

시간적 여유가 있을 때 emacs를 사용해보리라 다짐해본다.

 

서론이 길었다. 이클립스로 C를 개발하기에는 모자라다라는 말을 많이 들었다.

그래서 선뜻 이클립스로 C를 개발하기가 꺼려졌지만 한 번 설치해보기로 하였다.

 

먼저 JDK를 설치하여 이클립스가 돌아갈 수 있는 환경을 만들어야 한다.

이번에는 rpm으로 설치해고 싶은 마음이 들어 오라클 사이트로 가서 최신 JDK rpm을 다운 받았다.

다운로드 링크는 아래와 같다.

http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u4-downloads-1591156.html

 

#rpm -Uvh jdk-7u4-linux-i586.rpm 명령을 이용하여 설치를 하게되면,

/usr/bin/java로 링크가 만들어져 바로 java 명령어를 사용할 수 있다.

이외에 아래와 같이 /etc/profile에 환경변수 설정을 한다.

export JAVA_HOME=/usr/java/ㅓ아1.7.0_04

export CLASSPASS=.:$JAVA_HOME/lib/tools.jar

현재 터미널에 적용하기 위해서 #source /etc/profile 한번 실행해준다.

 

이제 이클립스를 다운받는다. 현재 이클립스는 V3.7로 Indigo라는 이름으로 아래 링크에서 바이너리를 다운받는다.

http://www.eclipse.org/downloads/

C/C++을 위한 플러그인인 CDT가 포함되고, 리눅스 개발자를 위한 패키지가 아래와 같이 따로 있다.

http://www.eclipse.org/downloads/packages/eclipse-ide-cc-linux-developers-includes-incubating-components/indigosr2

 

이제 받은 바이너리를 압축 해제한 후 실행을 해보았다.

기본적으로 이클립스의 설정파일인 eclipse.ini에서 사용메모리를 최대/최소 1024MB로 설정하였다.

-Xms1024m

-Xmx1024m

 

기존 소스 트리가 있는 디렉터리를 import 시켜 기존에 있던 Makefile를 이용하여 빌트해본 결과 Kdevelop와 비슷하게 컴파일 하였다.

기본적으로 make all로 컴파일 하는 듯한데, Makefile의 다른 옵션을 컴파일을 할 수 있는지는 조금더 살펴보아야 할일이다.

 

추가:

이클립스->Project->Make Target->Build 또는 단축키 Shift+F9를 눌러 Make Targets를 실행한다.

Add 버튼을 눌러 Create Make Target을 실행하여 Make 옵션별로 추가를 한다.

예로 기본적으로 Target name을 all로 입력하였다면, 해당 Target은 make all로 실행이 된다.

 

컴파일을 해보았으니 Run을 해보아야 할것이 아닌가.

Run 옵션으로 이동하여 컴파일된 실행파일의 경로를 설정하고, 실행하니 똭! 실행이 잘된다.

그럼 남은 디버깅! 두둥

Debug 옵션에서 마찮가지로 실행파일을 설정하고, 디버깅을 해본 결과 라인별 디버깅, 함수 이동, 변수 값 표시 등 기본적인 디버깅이 잘된다.

이정도면 만족하고 사용해볼만 하다고 여겨진다.

그리고 Kdevelop에서는 디버깅시 외부 라이브러리의 함수를 호출할 땐 디버깅이 멈추었는데, 이클립스에서는 멈추지 않고 잘넘어간다..

코드 분석에서 외부 함수를 못찾아 약간 X 표시가 보이지만 옵션으로 설정하니 해결이 가능하다.

X가 표시되니 그냥 불안하지만 정확하게 사용하고 있는 것이라면 무시하면 되겠다.

에디터 인코딩도 기본적으로 리스트에 EUC-KR이 안보여 어떻게 설정하나 고민했지만 리스트에 그냥 적어주니 바로 설정이 된다.

아직 사용기간이 짧으므로 이클리스에 대해 섯불리 판단하기는 이르지만 이정도면 사용해볼만하다라는 생각이 든다.

 

Posted by dcmru
,
openssl을 Windows XP 32bits환경에서 VC6로 컴파일할 일이 생겨 작업 후 정리를 하고자 한다.

먼저 openssl 소스를 http://www.openssl.org에서 다운로드 받는다.
내가 받은 버전은 openssl-1.0.0g 이다.

다음으로 Configure에 사용할 ActivePerl을 http://www.activestate.com/activeperl/downloads에서 다운로드 받은 후 설치한다.
내가 받은 버전은 5.14.2.1402이며, 설치시 설치 옵션에 Path 환경 변수 등록이 체크 되어 있는지 확인하여 설치한다.

다음으로 nasm을 다운로드 받는다. nasm을 사용안해도 되는 것 같지만, 속도를 위해 다운로드 받는다.
http://nasm.sourceforge.net/에서 다운받았으면, 적당한 경로에 압축을 해제한 후 Path 환경변수에 경로를 등록한다.
내가 받은 버전은 nasm-2.09.10-win32.zip 이다.

모두 다운로드 받았으면, openssl 소스를 적당한 곳에 압축해제한 후 명령프롬프트를 이용해 아래 순서대로 실행한다.

>perl Configure VC-WIN32 --prefix=c:\openssl-1.0.0g -DOPENSSL_USE_IPV6=0
>ms\do_nasm
>nmake -f ms\ntdll.mak
>nmake -f ms\ntdll.mak test
>nmake -f ms\ntdll.mak install

configure시 prefix 경로를 c:\openssl-1.0.0g로 설정하였으므로 해당 경로에 설치된다.
그리고 -DOPENSSL_USE_IPV6=0 옵션을 주지 않으면, nmake시 아래와 같은 에러가 발생하는데,

> .\apps\s_cb.c(731) : error C2027: use of undefined type 'in6_addr'
>         .\apps\s_cb.c(731) : see declaration of 'in6_addr'

이는 http://www.mail-archive.com/openssl-dev@openssl.org/msg29240.html 내용을 참고해보면,
VC6는 아직 IPv6를 제대로 지원하지 않아 발생하는 문제로 VC 2003 이상을 사용하여 컴파일 하거나
위와 같이 옵션을 주어 IPv6를 사용하지 않으면 된다.
Posted by dcmru
,

출처 : http://www.microsoft.com/korea/msdn/msdnmag/issues/06/05/x64/
Posted by dcmru
,
1. core 파일 생성하기

프로그램 시작하기 전에

#ulimit -c unlimited

수행



2. 버그 있는 프로그램을 실행하여 core파일 생성

# ./a.out

Segmentation fault (core dumped)



3. 디버깅하기

앞에서 만들어진 core.PID 형태로 생성된 core파일을 이용해서 디버깅

# gdb ./a.out -c core.PID
Posted by dcmru
,
리눅스 디버깅 기술 마스터하기

http://www-128.ibm.com/developerworks/kr/library/l-debug/#author
Posted by dcmru
,
문자셋관련 설명. [펌]


3가지 character type

Ascii == SBCS(single-byte character set) : 말 그대로 한 글자가 정확하게 1byte 길이로 이루어진 character들. 따라서 127 까지.



MBCS(multi-byte character set) : 한 글자가 1byte인 것들과 한 글자가 2byte인 것들(DBCS:double-byte)이 섞여 있다. 여기서 2byte인 것들은 double-byte 의 시작임을 표시하는 lead byte 와 한 글자의 뒷부분인 trail byte 로 나뉜다. 그럼 lead byte 인지 어케 알 수 있을까? lead byte 는 0x7f 값 이상. 즉 Ascii(127) 값보다 항상 크다는 특징이 있다. 그리구 trail byte 는 0이 아닌 아무 값이나 된다.



Unicode == wide characters : 한글자의 길이가 항상 2byte 이다.


* Unicode 3가지 주요 Encoding Form
UTF-8 : UTF-8 is popular for HTML and similar protocols.UTF-8 is a way of transforming all Unicode characters into a variable length encoding of bytes. It has the advantages that the Unicode characters corresponding to the familiar ASCII set have the same byte values as ASCII, and that Unicode characters transformed into UTF-8 can be used with much existing software without extensive software rewrites.


UTF-16 : UTF-16 is popular in many environments that need to balance efficient access to characters with economical use of storage. It is reasonably compact and all the heavily used characters fit into a single 16-bit code unit, while all other characters are accessible via pairs of 16-bit code units.


UTF-32 : UTF-32 is popular where memory space is no concern, but fixed width, single code unit access to characters is desired. Each Unicode character is encoded in a single 32-bit code unit when using UTF-32.

SBCS와 MBCS는 문자열 종료값이 1byte 0이구, Unicode 는 2byte 0.

이하 댓글...

unicode 인경우 그 인코딩 타입에 따라서 길이가 다릅니다. 항상 2 byte는 아니죠. 와이드 캐릭터(wchar_t)인 경우도 컴파일러에 따라 길이가 다릅니다. 비쥬얼C++에서는 2byte고 gcc 에서는 4바이트라고 하는 군요.

Commented by 코니 at 2005-07-26 20:37 x
MBCS 문자열처리시 유용한 함수들..

_mbsnextc : 다음문자(2바이트문자 나 1바이트 문자)를
unsigned int로 리턴한다.
_mbsinc : 다음문자로 포인터를 이동시켜준다
(2바이트는 2만큼, 1바이트는 1만큼)

unsigned int wchar = NULL ;
while((wchar = _mbsnextc((unsigned char*)next)) != 0) {
// 잘 사용해 본다.
next = _mbsinc(next);
}
Posted by dcmru
,