Eclipse를 쓰다보니 디버깅도 Eclipse로 하고 싶어졌다. 

문제는 로그인한 유저와 디버깅 대상 프로세스가 실행되고 있는 유저가 다르다는 것. 

"C/C++ Attach to Application"을 사용하려 해도, 해당 프로세스에 대한 권한이 없어서 안된다. 


이를 해결하기 위해 첫 번째 해야 될 일은 "sudo gdb"이다. 

이렇게 하면, gdb를 실행할 때 root로 실행하기 때문에 다른 프로세스에 접근할 수 있게 된다.

그러나 실제로 위를 실행하면 실행이 안 되는데,  sudo를 할 때 패스워드를 입력해야 되어 프롬프트에서 멈추게 되는데, eclipse에서는 이를 입력할 수 있는 방법이 없다. 

그래서 두번째로 해야 될 일은 현재 유저가 gdb에 대해서는 root로 실행할 때 패스워드를 입력하지 않아도 되게 하는 것이다. 이는 root로 접속하여 visudo를 실행하여 아래와 같이 수정한다. 

<users> ALL=(root) NOPASSWD:<program>



이제 root 권한으로 이클립스에서 타 유저의 프로세스를 디버깅할 수 있게 된다. 


출처:http://stackoverflow.com/questions/2891356/how-to-debug-application-as-root-in-eclipse-in-ubuntu


' > 개발' 카테고리의 다른 글

VIM - 여러 파일 편집  (0) 2013.04.08
Eclipse에서 다른 유저의 프로세스 debug  (0) 2013.04.05
GDB에서 특정 쓰레드만 멈추게 하는 법  (0) 2013.03.27
vi 설정  (0) 2013.02.22
Difftool  (0) 2012.12.17
No repository found in Eclipse  (0) 2012.11.27
Posted by 라판

Eclipse 속도 향상 팁

2013.03.06 16:07

참고로, eclipse.ini에 대한 위키는 여기를 참조:




* eclipse.ini 파일을 다음과 같이 수정

 원본수정 후 
-vmargs
-Dosgi.requiredJavaVersion=1.5 
-Xms40m  
-Xmx256m
-vmargs
-Dosgi.requiredJavaVersion=1.5 
-Xverify:none 

-XX:+UseParallelGC
-XX:-UseConcMarkSweepGC 

-XX:PermSize=32M
-XX:MaxPermSize=128M  
-XX:MaxNewSize=32M 
-XX:NewSize=32M 
-Xms256m  
-Xmx256m



* 설명

-Xverify:none                         // 클래스 검사 생략. 이클립스 실행 시간이 줄어든다.
-XX:+UseParallelGC               // Parallel Collector를 사용. 병렬 가비지 컬렉션.
-XX:-UseConcMarkSweepGC // 병행 mark-sweepGC 기능을 수행하여 GUI 응답 속도 처리
-XX:PermSize=32M                // 이클립스 클래스 로딩 기본 메모리
 
-XX:MaxPermSize=128M       // 이클립스 클래스 로딩 최대 메모리
-XX:NewSize=32M                 // JVM에서 새로운 객체가 생성 될때 로딩되는 최소 영역
-XX:MaxNewSize=32M           // JVM에서 새로운 객체가 생성 될때 로딩되는 최대 영역
-Xms256m                            // 이클립스 실행시 잡는 최소 메모리
-Xmx256m                            // 이클립스 실행시 잡는 최대 메모리

* Xms와 Xmx를 똑같이 잡아 주는 이유는 이클립스가 메모리를 유동적으로 관리하는데 이걸 정적으로 고정시켜 주기 위해서이다. 유동적으로 관리하게 놔두면 자바는 메모리가 부족할때 확보하려고 메모리 할당을 하게 되고 메모리의 여유가 있으면 남는 메모리를 조금씩 시스템으로 돌려버린다. 이러한 작업때문에 이클립스 속도가 더 느려지기에 아예 처음부터 최소값과 최대값을 고정시켜 버리면 불필요한 작업을 하지 않게 된다. 물론 메모리 값은 컴퓨터 사양에 따라 수정해주시면 된다. 




* 힙 메모리 정리
Window -> Perference -> General  에서 'Show heap status'에 체크.



체크를 해주면 이클립스 오른쪽 하단에 현재 메모리 사용량과 휴지통 아이콘이 생긴다.
힙에 메모리가 많이 쌓였을때 휴지통을 눌러서 한번씩 날려주면 빨라진다.






* 코드 오토 어시스트 기능 비활성화
 
코드 어시스트 기능을 끈다. 단축키 ctrl + space 로 코드 어시스트 사용가능하다.
Window -> Preferences -> Java -> Editor -> Code Assist tab 에서 'Enable auto activation' 을 꺼준다.

아래의 글은 Sun(Oracle?) Hotspot JVM을 기반으로 정리한 내용이다.

JVM에서 GC는 크게 Minor GC와 Major GC로 나뉜다. Minor GC는 Young Generation영역을 정리하는 GC이고, Major GC는 Old Generation영역을 정리하는 GC이다. 그리고 Major GC는 Full GC로도 불린다. 하지만 일부 CMS Collector를 설명하는 글에서는 Major GC와 Full GC를 구분하기도 하는 것 같다. Major GC와 Full GC의 명확한 구분은 잘 모르겠다.

                     Java Heap Memeory 구조


GC의 종류는 아래와 같다. 
===========================================================================================
1. Serial Collector
  - 단일 Thread로 GC 작업을 수행
  - "-XX:+UseSerialGC" 옵션 사용하여 활성화 할 수 있다. 
  - 요즘 H/W환경에서는 사용할 필요가 없는? GC라고 생각된다.
 
2. Parallel Collector
  - 복수의 Thread로 GC작업을 수행한다 
  - "-XX:+UseParallelGC" 옵션을 사용하여 Minor GC 에서 parallel collector를 활성화 할 수 있다.
  - "-XX:+UseParallelOldGC" 옵션을 사용하여 Major GC에서 parallel collector를 활성화 할 수 있다. 
  - 복수의 Thread를 사용하여 GC를 수행하기 때문에 Serial Collector에 비해서 GC가 빨리 수행된다.
  - 최대 성능을 내기 위한 GC라고 생각된다.

3. CMS Collector
  - Major GC 실행시 Application Thread와 GC Thread가 동시에 수행된다. (GC의 6단계 중에서 2단계에서만 Application Thread를 Block 하며 나머지 4단계는 동시에 수해된다.)
     * 참조 :  http://www.javaperformancetuning.com/news/qotm026.shtml
  - "-XX:+UseConcMarkSweepGC" 옵션을 사용하여 활성화 할 수 있다. 
  - Minor GC에서 Parallel Collector를 활성화하기 위해서는 "-XX:+UseParNewGC" 옵션을 사용해야 하며,  "-XX:+UseParallelGC" 와는 같이 사용해서는 않된다!!!
  -  Parallel Collector GC 보다는 최대 성능이 낮게 나오지만, GC로 인한 Application Thread 정지 시간을 최소화 하여 응답시간 지연을 줄이고자 하는 경우 사용된다.
  - CMS Collector에 의한 Major GC가 수행되는 동안 Application에 의해서 Old generation 영역이 꽉차게 되면, 모든 Application Thread를 멈추고, Full GC를 수행하게 된다.
===========================================================================================

JVM Heap 메모리 및 GC 옵션 예제
  - 최소 사이즈 : -Xms128m
  - 최대 사이즈 : -Xmx384m
 
 - GC 로그 옵션 
   > -verbose:gc -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
  - Young Gen 영역을 위한 옵션 
    > -XX:NewSize=100m -XX:MaxNewSize=100m -XX:SurvivorRatio=32
  - GC 소요시간 최소화 옵션
    > -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:-CMSParallelRemarkEnabled
  - 성능을 위한 기타 추가 옵션
    > -XX:MaxTenuringThreshold=0 -XX:CMSInitiatingOccupancyFraction=60
  - OutOfMemoryError 발생시 자동으로 힙덤프 생성 옵션
    > -XX:+HeapDumpOnOutOfmemoryError -XX:HeapDumpPath=/path

JVM 옵션 상세 정보 참고자료 :  http://wiki.ex-em.com/index.php/JVM_Options

기타 툴
  - Java Stack Trace (dead lock 분석)
    > jps   [java 프로세스 확인]
    > kill -3 <pid>  [IBM JDK]

    > $JAVA_HOME/bin/jstack <pid>   [Hotspot JDK
  - Runtime JVM Heap Dump 생성
    > jmap -dump:format=b,file=heap.hprof [pid]
  - 힙덤프 분석 툴 : jhat, MemoryAnalyzer, visualvm

'' 카테고리의 다른 글

VMWARE workstation 7.1.4 patch for kerenel 3.1  (0) 2013.06.28
NX Client 속도 향상  (0) 2013.04.27
[명령어] 특정유저 프로세스 강제 종료 명령어  (0) 2013.04.08
NX 단축키  (0) 2013.04.05
Eclipse 속도 향상 팁  (0) 2013.03.06
Posted by 라판

작업 서버에 문제가 있어 VNC나 Xming으로 작업하려면 너무 느려서 애로사항이 많았다.

자주 ping이 100~1000ms을 찍고 있으니, GUI 작업은 무리인게 당연하다. 

근본적으로 서버쪽 네트워크쪽에 문제가 있어 보이지만, 다시 VI에 온갖 플러그인을 갖다 붙여서 사용해보려 하지만,

본래 내가 손이 느린데다가, 익숙하고 편리한 이클립스를 포기할 수 없어 전전긍긍하던 중, 

NX Server에 대한 이야기 들려서 깔아봤는데, 결과는 대만족!! 

네트워크 문제가 있는 것을 감안하더라도, 꽤나 안정적으로 잘 돌아간다. 

 앞으로 애용할 것으로 보인다. 

설치방법도 매우 간단하다 

  1. linux 배포판 확인 : cat /etc/Suse-release => SLE 11.1임을 확인 
  2. zypper에 Suse의 RemoteDesktop에 대한 저장소 링크 추가 : zypper ar http://download.opensuse.org/pub/opensuse/repositories/X11:/RemoteDesktop/SLE_11/ RemoteDesktop
  3. 새로 링크된 RemotteDesktop 저장소 업데이트 - zypper ref 
  4. FreeNx와 NX 설치 :zypper in FreeNX NX
  5. Nxserver 설정 
    1. nxsetup --install --setup-nomachine-key
    2. nxserver --status
  6. LocalPC 환경에 맞는 Nx Client 설치 (windows - http://www.nomachine.com/download-package.php?Prod_Id=3835)
  7. Nx Client 실행 및 설정 
    1. Session에 대한 이름 작성
    2. Host 및 port 설정(대개 ssh를 쓸 것이므로, port는 22로 함) 
    3. 인터넷 속도 - LAN
    4. 연결시 사용할 GUI 환경 - Unix - KDE => 각 서버에서 주로 쓰는 GUI 환경에 맞게 설정 
    5. 기타 화면 설정
  8. 사용 
어서 서버 문제가 해결되어 신나게 코딩할 수 있음 좋겠다!! 

참조
  • http://en.opensuse.org/SDB:FreeNX_server#Setting_up_things
  • http://mcchae.egloos.com/10483664

ps. 이클립스 속도 팁 - http://miruel.egloos.com/2735094

' > 일반' 카테고리의 다른 글

screen  (0) 2013.06.14
Launchy  (0) 2013.04.11
FreeNX : VNC을 대신할 RemoteDesktop (번외 eclipse 속도 tip)  (0) 2012.11.08
tightvnc에서 텍스트 복사/붙여놓기  (0) 2012.11.02
Posted by 라판

라이센스 문제로, 이전 회사에서 쓰던 realVNC를 쓰는데 많은 제약이 있다. 

회사에 설치된 VNC가 tightVNC이기도 하고, 로컬PC에서는 realVNC Viewer를 쓰곤 있지만(executable!) tightVNC Server가 copy and paste를 지원하지 않아, 영 불편하였다. 


그러던 도중, tight-vnc에서 copy and paste를 가능하게 하는 툴을 찾았다. 그것은 autocutsel이라는 툴.

다행히 GNU 라이센스여서 맘 놓고 설치 가능하다. 

http://www.nongnu.org/autocutsel/에서 다운받아 linux에서 설치한다. (단 root권한 필요함) 

설치 방법은 설치 압축파일의 README를 참고면 되며 간단히 아래와 같이 따라하면 된다. 

* Build 

  1. tar -xvf autocutsel-0.9.0.tar.gz
  2. cd autocutsel-0.9.0
  3. ./configure
  4. make

* Install ( root권한)

  1. make install
이제 vnc로 접속하여 터미널을 열고 아래 명령어를 실행하면 된다. 
   * autocutsel -S [CLIPBOARD or PRIMARY] -fork 
내 경우에는 CLIPBOARD로 하니깐 잘 되었다. 
접속할 때마다 쓰는 게 귀찮으니 .vnc/xstartup에 위의 명령어를 추가한다. 


' > 일반' 카테고리의 다른 글

screen  (0) 2013.06.14
Launchy  (0) 2013.04.11
FreeNX : VNC을 대신할 RemoteDesktop (번외 eclipse 속도 tip)  (0) 2012.11.08
tightvnc에서 텍스트 복사/붙여놓기  (0) 2012.11.02
Posted by 라판

  git을 사용하다 보면 push 전 pull을 하지 않아, 변경내역이 손실될 때가 생긴다. 

다음 히스토리를 보자. 

                                  c

          ==========o <-- mywork

        /            \

 o--o--o--o--o--o--o--o--o  <-- master

       a     b        m   

    pull을 통해 master 브랜치의 commit a까지 업데이트되었다고 가정하자. 

그리고 mywork라는 변경내역으로 commit c를 만들어 push하려고 한다.  

그러나 그 와중에 누군가 master branch에 commit b 등 여러 커밋을 push하였고, 

만약 충돌이 발생 시, 정상대로라면 mywork의 push는 다음 에러와 함께 거절당한다.

[rejected - non-fast-forward ]


그러나 사용자의 실수로 인해(어떻게 이런 경우가 생기는 지는 파악이 안되었다) push가

되어 머지 commit m이 만들어지고 기존 commit a-b-m 의 경로의 변경내역은 사라지게

되는 현상이 발생하였다. 

이 경우 복구를 위해 우리가 할 수 있는 것은 손수 local에 commit m 이전의 변경내역을

저장하고 이를 복사하여 다시 commit과 push를 하는 것이다. 


그러나 git에는 이러한 불편한 작업들을 git revert란 명령어로 깔끔하게 이전 commit을 취소하도록 해준다. 

그리고 특히 위와 같이 merge commit을 revert할 때는 다음과 같이 명령어를 쓰면 된다. 

git revert -m <부모 숫자> <merge commit> 

여기서 부모 숫자는 merge의 경우 2개의 부모를 가지는데, 2개의 부모 중 어떤 부모를 reversing에 있어

메인라인으로 취급할 것이냐를 결정한다. 대개 commit 내역에서 제일 첫번째로 표시된 parent가 1, 두번째가 2,

이런 식이다. 


git revert로 merge 이전의 상태로 돌려졌으면, 이 상태에서 mywork 변경내역을 다시 commit하여 push하면 

정상적으로 복구할 수 있다. 


참조 - http://namhyung.springnote.com/pages/3132772#toc_6



Posted by 라판