우선 저번 문서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
이것으로 이클립스 없이 디버깅 하기가 가능해 지지 않았을 까 한다.
이상.
'모바일프로그래밍 > 안드로이드' 카테고리의 다른 글
디버깅 가능한 Android 애플리케이션 공격하기 (0) | 2023.03.07 |
---|---|
커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 부록 (0) | 2023.03.06 |
커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 - 2 (0) | 2023.03.04 |
커맨드 창과 에디터로 안드로이드 프로그래밍 해보기 (1) | 2023.03.02 |
[안드로이드] 액티비티 테스트 자습서 (0) | 2023.02.19 |