문제

내 질문은 GDB/GDBServer를 사용하여 임베디드 암 프로세서에서 응용 프로그램을 원격 디버깅하는 것입니다.

응용 프로그램 자체를 디버깅 할 수는 있지만 응용 프로그램은 In House Communications 프로토콜을 구현하는 공유 라이브러리로 동적으로 연결됩니다. 공유 라이브러리 기능 내에서 중단 점을 설정할 수 있으므로 일부 장치 검색 문제를 파악하십시오.

라이브러리에 디버그 기호로 컴파일되고 호스트 측면에서 GDB에 의해로드되어 있는지 확인하고 라이브러리 내에 기능을 나열하고 중단 점을 설정할 수도 있지만 응용 프로그램을 실행하려고하자마자 오류 메시지가 표시됩니다. 효과 :

Cannot insert breakpoint X.
Error accessing memory address : Input/output error.

여기서 X는 GDB의 중단 점 번호이며 유효한 주소까지는 주소입니다.
대상과 호스트 머신 모두에서 새 라이브러리를 사용하고 있지만 mount -o bind newlib oldlib NFS 마운트의 대상에.
무엇이 잘못 될 수 있는지에 대한 아이디어가 있습니까? 미리 감사드립니다.

도움이 되었습니까?

해결책

Wild Propess : 공유 라이브러리를 호스트에로드했습니다. GDB 잘못된 주소로.

GDB에 명시 적으로로드하는 대신 사용하십시오 "set stop-on-solib-event on", 도서관이로드 될 때까지 기다립니다 (info shared 로드 된 라이브러리의 현재 목록을 알려줄 것입니다). 그 다음에 중단 점을 설정하십시오.

다른 팁

이 질문은 2009 년이지만 현재 답변은 오래되지 않으므로 여기에 업데이트가 있습니다.

@Employed Russian은 사용해야한다고 제안했습니다 stop-on-solib-event. 이것은 더 이상 사실이 아닙니다. NDK R8D는 아직로드되지 않은 SOLIBS에서 보류중인 중단 점을 지원합니다.

@Brent Piddy가 그렇게 말합니다 stop-on-solib-event gdbserver와 함께 작동하지 않습니다. 이것은 최소한 R8C 이후 더 이상 사실이 아닙니다. 우리 회사는 GDB 의이 NDK 행동에 의존하는 제품을 보유하고 있습니다.

다음 명령을 사용하여 공유 객체 라이브러리가로드 된 후 해결 될 보류중인 중단 점을 설정하십시오.

set breakpoint pending on

안타깝게도 GDBSERVER가 SOLIB 이벤트를 인식/보내지 않기 때문에 GDBSERVER 원격 디버깅에 "Set Stop-on-Solib-Event on"을 사용할 수 없습니다. 나는 단지 SOLIB-SEARCH-PATH 또는 SET SYSROOT 명령을 발행하여 GDB가 메인에서 중단 점을 누른 후 공유 라이브러리 기호를 모두로드하도록해야했습니다.

실행하십시오 main 그리고 set solib-search-path .

그렇지 않으면, gdbserver 라이브러리가로드되기 전에 동적 로더에서 정지합니다. ~에 main, 그들은 GDB를 준비해야합니다.

자세한 내용은: GDBSERVER와 공유 라이브러리를 디버깅합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top