커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 3

2023. 3. 5. 19:55모바일프로그래밍/안드로이드

728x90

 

 

커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 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:

[그림 1]

그래서 구글링 해보다가, 문득 다음 문서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
 

 

​이것으로 이클립스 없이 디버깅 하기가 가능해 지지 않았을 까 한다.

 

이상.


 

 

728x90