2012-05-04 3 views
3

공유 라이브러리 내에서 SEGSEGV을 얻은 후에 스택 트레이스를 가져 와서 파일에 저장하려고합니다. 공유 라이브러리는 폐쇄 형 소스 제품의 플러그인입니다. 이 모든 것은 프로덕션에서 작동하며 직접 액세스 할 수는 없습니다.공유 라이브러리 내의 백 트레이스 기능

내 코드는 SIGSEGV 신호를 포착하고 스택 추적을 인쇄하고 종료합니다. 나는 이런 일이 : [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so

을 [0x2aecc2019f11] /옵션/ecelerity/libexec 디렉토리 /opt/ecelerity/libexec/site/ec_attachextensions.so /site/ec_attachextensions.so [0x2aecc2019fee] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc201a587]

/옵션/ecelerity 경우/sbin/ecelerity [0x5]

/옵션/ecelerity/sbin에/ecelerity (sieve_seng_execute + 0x82) [0x506d32] /opt/ecelerity/libexec/validate/sieve.so [ 0x2aecc2862c9e] /옵션/ecelerity 경우/sbin/ecelerity (validate_data + 0xa5) 0x4a90d5] /옵션/ecelerity 경우/sbin/ecelerity (esmtp_message_factory + 0x154e) 0x46eace] /옵션/ecelerity 경우/sbin/ecelerity (schedule_event_and_dispatch + 0x6a) [0x49c59a]

문제는 공유 된 라이브러리의 경우 함수 및 오프셋의 이름을 사용할 수 없다는 것입니다. 내가 이해 한대로 /proc/$PID/maps에 오프셋 된 라이브러리를 찾은 후에 addr2line 유틸리티를 사용하여 주어진 주소에 대한 함수 이름/파일 이름을 찾을 수 있습니다. 그 후

나는 그런 식으로 뭔가를 실행 해요 : 0x2aecc2019f11 위의 스택 트레이스의 주소입니다

addr2line -e /opt/ecelerity/libexec/site/ec_attachextensions.so (LIBRARY_OFFSET_FROM_MAPS_FILE - 0x2aecc2019f11) 

. 나는지도 파일을 건드리지 않고 스택 추적에서 함수 이름을 얻을 수있는 방법이 있는지 궁금합니다. 즉, 어떻게 프로그래밍 할 수 있습니까? dladdr 여기에서 도움이 되겠습니까? dladdr 내 경우 backtrace이 제공하는 주소에서 함수 이름을 가져올 수 없습니다.

답변

1

백 트레이스 코드는 함수 이름을 결정하기 위해 dladdr과 거의 동일한 메커니즘을 사용합니다.

라이브러리가 내 보낸 항목을 정의하고 다른 모든 항목의 표시 여부를 제한하는 데 사용할 수있는 링커 맵 파일을 사용하거나 기호가 명시된 기호가있는 -fvisibility=hidden을 사용하여 라이브러리를 작성하는 경우 기호가 흐리게 표시됩니다 백 트레이스 출력에는 나타나지 않습니다.

해결 방법은 라이브러리의 모든 심볼의 가시성을 제한하는 맵 파일을 사용하지 않고 컴파일하거나 -fvisibility=default으로 빌드하는 것입니다. 그것은 당신을 위해 어떤 노력도없이 일하기 위해 역 추적을 얻을 것입니다.

이렇게하지 않고 작동 시키려면 .so에서 로컬 기호 테이블을로드하고 addr2line과 유사한 메커니즘을 사용하여 심볼 위치를 결정해야합니다. 이를 수행하는 메커니즘은 libelf1을 사용하는 것입니다. 로컬 심볼 테이블을 읽습니다.

... 물론 테이블에서 파일을 제거하지 않아야합니다. 그렇다면 .so가 정보를 제공하지 않기 때문에 이러한 트릭은 중요하지 않습니다.

1

신호 처리기에서/proc/self/maps를 읽을 수 있습니다.

또는 라이브러리 오프셋을 찾기 위해 비교 지점으로 사용할 수있는 일부 기능의 절대 주소를 출력 할 수 있습니다.

하지만 기본 주소를 제공하는 동적 링커 기능이 있다면 놀라지 않을 것입니다. 문서를 확인할 수 있습니다.

관련 문제