커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 3
커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 3
우선 저번 문서1에서 언급한 내용 대로 마지막 jdwp 활동 내역을 체크한다. 그리고 해당 아이디를 7777 포...
blog.naver.com
우선 저번 문서1에서 언급한 내용 대로 마지막 jdwp 활동 내역을 체크한다.
adb jdwp
그리고 해당 아이디를 7777 포트로 연결 해 준다.
adb forward tcp:7777 jdwp:22545
위의 예는 해당 아이디가 22545 라고 가정한다.
그리고 문서대로 연결 시키면 다음과 같은 오류가 난다.
jdb -sourcepath ./src -attach localhost:7777
shmemBase_attach failed:

그래서 구글링 해보다가, 문득 다음 문서2를 보고 해당 포트가 떠있는 지 먼저 확인 해 보았다.
netstat -an|findstr 7777
현재 위의 포트는 떠 있는 걸로 확인 되었으며 이렇게 되면 위의 문서대로 서버 리슨을 하고 있다는 결론이 났다.
다음 명령어를 실행 하면 당연히 주소가 사용중이라고 나오겠지...
java -agentlib:jdwp=transport=dt_socket,address=localhost:7777,server=y,suspend=y ScheduleTask
ERROR: transport error 202: bind failed: Address already in use
그럼 서버가 떠 있으니, 클라이언트로 다시 연결을 다음과 같이 시도 한다.
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=7777
그러니까 다음과 같이 연결 되었다.
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
그리고 다음과 같이 tasks.ScheduleTask 클래스 71번째 줄에 브레이크를 걸어 보면...
> stop at tasks.ScheduleTask:71
Set breakpoint com.skens.sms.gis.tasks.ScheduleTask:71
걸렸다는 것이다.
그리고 아래 문은 디버깅을 시작하고 있는 모습이다.
Startup commands can be placed in either "jdb.ini" or ".jdbrc"
in user.home or user.dir
<86> Thread-17778[1] step
>
Step completed: "thread=<86> Thread-17778", tasks.ScheduleTask.getTSMSDataSet(), line=40 bci=0
<86> Thread-17778[1] stepi
>
Step completed: "thread=<86> Thread-17778", tasks.TSMSTask.processTSMSTask(), line=83 bci=0
<86> Thread-17778[1] next
>
Step completed: "thread=<86> Thread-17778", tasks.TSMSTask.processTSMSTask(), line=85 bci=5
<86> Thread-17778[1] next
>
Step completed: "thread=<86> Thread-17778", tasks.TSMSTask.processTSMSTask(), line=88 bci=6
<86> Thread-17778[1] print responseJson
responseJson = null
<86> Thread-17778[1] next
>
Step completed:
위에서 널인 문자를 찍다가 오류가 나서 모두가 멈추었다아...
그럼 요약 해 보면 다음과 같은 절차에 따라서 안드로이드를 브레이크 포인트를 걸어 디버깅 할 수 있다는 결론을 얻었다.
디버깅의 예
1. 우선 프로그램을 구동한다.
2. 다음 명령어로 프로세스 포트를 확인 한다.
adb jdwp
3. 해당 포트를 7777로 포워딩한다. 여기선 위 명령어로 확인한 값을 4509라고 가정 한다.
adb forward tcp:7777 jdwp:4509
4.7777번 포트가 떳는 지 확인한다.
netstat -an|findstr 7777
TCP 127.0.0.1:7777 0.0.0.0:0 LISTENING
5. jdb.ini 를 만들고 다음과 같이 세팅함
stop at tasks.ScheduleTask:41
6. 7777번 포트로 연결한다.
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=7777
7.디버깅 시작
제대로 걸렸다면 다음 메시지가 나타난다.
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
*** Reading commands from D:\DEV\skens\mobile\skens_android\jdb.ini
Deferring breakpoint com.skens.sms.gis.tasks.ScheduleTask:41.
It will be set after the class is loaded.
> > Set deferred breakpoint com.skens.sms.gis.tasks.ScheduleTask:41
8. 해당 프로세스를 수동으로 시작
Breakpoint hit: "thread=<57> Thread-18007", tasks.ScheduleTask.getTSMSDataSet(),line=41 bci=0
9. 현재 쓰레드 상의 값 확인
<57> Thread-18007[1] print jsonScheduleData
jsonScheduleData = "{"d":"{\"DataSet\":....
10. 다음 라인으로
next
11. 오류의 경우 빠져 나온다.
<57> Thread-18007[1] print mIsSuccessMessage
mIsSuccessMessage = false
<57> Thread-18007[1] exit
이것으로 이클립스 없이 디버깅 하기가 가능해 지지 않았을 까 한다.
이상.