Android/Platform2009. 9. 24. 11:58
바로 앞 포스팅에 이어, Eclipse에서 Android Platform Build가 끝난 상태에서
Eclipse와 emulator를 연결하여 debuging을 하려다가 다시 문제에 봉착했다.
원인을 알고 나면 부끄러워지게 된다.


http://source.android.com/using-eclipse 를 참고하여 진행한다.

터미널에서 아래와 같이 입력하여 emulator를 실행 시키고,
~$ cd /path/to/android/root
~$ . build/envsetup.sh
~$ lunch 1   # to build the emulator
~$ make      # if you didn't already do this
~$ emulator  # you should see a GUI picture of a phone


다시 다른 터미널을 열어서 아래와 같이 입력하여 DDMS를 실행한다.
~$ cd /path/to/android/root
~$ ddms      # you should get a splufty debugging console

그리고 나서 eclipse의 debug를 연결시키면 되는데..

1. Run > Open Debug Dialog...
2. Right-click "Remote Java Application", select "New".
3. Pick a name, "android-debug" or anything you like.
4. Set the "Project" to your project ("android-java" or whatever).
5. Keep the "Host" set to "localhost", but change "Port" to 8700.
6. Click the "Debug" button and you should be all set.


위와 똑같이 진행하였지만
Eclipse에서는 아래와 같은 error popup이 발생하였다.

Could not open Selected VM debug port (8700). Make sure you do not have another instance of DDMS or of the eclipse plugin running. If it's being used by something else, choose a new port number in the preferences.

'Launching android' has encountered a problem. Failed to connect to remote VM



http://source.android.com/using-eclipse 를 상세히 읽어 보니,
아래 내용을 지나쳣다!

Note that port 8700 is attached to whatever process is currently selected in the DDMS console, so you need to sure that DDMS has selected the process you want to debug.

port 8700은 DDMS console에서 현재 선택된 process와 연결이 되기 때문에 디버그 하고자하는 process를 DDMS에서 확실히 선택해야 한다.

그렇다. 아래 이미지와 같이 원하는 process를 선택하게 되면
포트옆에 8700 port가 연결이 된다.


다시 Eclipse에서 Debug 를 실행 해보면 eclipse - ddms - emulator 가 연결되어 정상적으로
디버깅이 됨을 알 수 있다.

process가 debug상태가 되면 녹색 벌레가 출현한다.





http://developer.android.com/guide/developing/tools/ddms.html
위 사이트에 있는 DDMS의 기동에 대한 간단한 설명이다.

  1. DDMS 시작 시 adb server, client가 연결되고 둘간의 device monitoring service가 시작된다. device가 연결되거나 끊어질 경우 DDMS에게 알려준다.
  2. device가 연결되면 target의 adb와 DDMS간에 VM monitoring service가 생성된다. 그 후 디바이스의 VM(process)가 종료되거나 시작되면 DDMS에 알려준다.
  3. VM이 구동 되면, DDMS는 adb를 통해서 VM pocess의 pid 값을 검색한 후 디바이스의 adb daemon을 통해서 VM의 debugger와 연결 한다.
  4. DDMS는 custom wire protocol을 이용해서 target의 VM(process)과 통신할 수 있다.
  5. device의 각 VM을 위해서 DDMS는 디버거와 연결할 port를 연다.
  6. 첫번째 VM을 위해서 DDMS는 8600번 포트를 통해 debugger를 연결한다. 다음은 8601..
  7. debugger(eclipse)가 이 중 한 port와 연결이 되면 그 VM의 정보들을 받을 수 있게 된다.
  8. DDMS는 base port인 8700 local port를 연다. 8700port가 일반적으로 debugger가 연결이 되어야 하는 port임.

DDMS는 adb(android debug bridge) daemon, adb client, adb server를 사용하여 돌아가는 server, client 를 이용한다.
그리고 emulator에서 실행되는 모든 application들은 하나의 process(각 process는 각자 하나의 dalvik VM을 포함함)를 가지게 되는데, DDMS가 emulator나 real target device와 연결을 하게 되면
target으로 부터 각 process의 정보를 받아오고 adb를 통해 각각에 port(process port 8600~)를 할당해준다.

위와 같이 정상적으로 연결된 상태라면 DDMS에서 하나의 process를 선택하게 되면 default Debug VM port인 8700번으로 선택한 Process port forwarding 을 하게 되어 외부(Eclipse)에서 DDMS를 통해서 원하는 Process를 debug 할 수 있게 되는 것이다.

※잘못된 정보에 대해서는 가차없는 지적 바랍니다.

Posted by ekwang