2009-08-26 5 views
7

특정 라이브러리의 작동 방식을 이해하려고합니다. 나는 추가 된 prinfts로 그것을 컴파일했고 모든 것이 훌륭합니다. 이제 런타임 동안 예제 프로그램을 중단하여 호출 스택을 보려고하지만 gdb로 수행하는 방법을 알 수는 없습니다. 중단하고 싶은 기능은 공유 라이브러리 안에 있습니다. 나는 여기에서 previous question을 검토했지만, 그 접근법은 나를 위해 작동하지 않습니다. 문제의 언어는 C++입니다. 파일 이름과 줄 번호를 제공하려고 시도했지만 gdb는이를 이해하지 않고 데모 응용 프로그램의 소스 파일 만 나열합니다.런타임 중에 공유 라이브러리 내에서 디버깅/추적?

제안 사항?

답변

4

"main main break"를 먼저 수행 할 수 있습니다. 그 때까지는 공유 라이브러리가로드되어야하며, 그런 다음 모든 루틴에 중단 점을 설정할 수 있습니다.

+1

예 (내가 세부 자신을 설명 할 수 있지만) GDB에서 그런 식으로 중단 점을 설정하지만, 그 컴파일 확신 할 수 라이브러리를 -g와 함께 사용하고 최적화를 해제하십시오! – Alex

+0

불행히도 그게 도움이되지 못했습니다. 이 기능은 메인에서조차도 여전히 보이지 않습니다. 실행을 멈추고 디버거에 떨어 뜨릴 수 있도록 코드에 추가 할 수있는 것이 있습니까? – EightyEight

+0

@ EightyEight : 흠, 저에게는 효과적입니다. 아마도 디버깅하려는 라이브러리가 dlopen()을 통해 동적으로로드 되었습니까? 왜 메인에서 보이지 않는지 설명 할 수 있습니다. 이 경우 대상 라이브러리에 대한 dlopen 호출 후 초기 중단 점을 설정 한 다음 최종 중단 점을 설정할 수 있습니다. 더 간단한 방법이 있어야하는 것처럼 보입니다. 나는 계속 볼거야. –

3

고려해야 할 (그리고 귀하의 질문에 당신이 분명히있는 경우하지 않습니다)는 두 경우가 있습니다
- 실행 파일을 직접 공유 라이브러리와 링크 :
GDB은 "참조"를된다는 것을 의미합니다 dlopen 완료 때까지 그 경우
, GDB는 "인식"하지 않습니다 공유 라이브러리 : 실행 파일이 동적으로 공유 라이브러리를로드 (예를 통해 dlopen) - 당신이
주에 중지 문자 (및 소스) 공유 라이브러리에서.

메인에서 멈출 때 기호를 볼 수 없기 때문에 두 번째 경우가 있다고 생각합니다. 프롬프트에서 "set stop-on-solib-events 1"을 수행 할 수 있으며 GDB은 새 공유 라이브러리가로드 (또는 언로드) 될 때마다 중지됩니다.

어떤 라이브러리 GDBinfo shared 명령을 통해 알 수 있는지 확인할 수 있습니다.
중단 점을 설정하기 전에 대상 라이브러리가 목록에 나타날 때까지 기다리십시오.

+0

이 솔루션은 Oracle의 SQLPlus 클라이언트 응용 프로그램을 디버깅하는 동안 작동하지 않습니다. –

1

에 체크를 아웃 :

http://linux.die.net/man/1/ltrace

는 라이브러리 호출을 추적한다 - 아마 유용합니다.

"strace"는 시스템 호출에 대해 동일한 작업을 수행합니다.

그리고 당신은 진입 점을 찾을 수 있어야합니다 ... 당신은

관련 문제