공유 라이브러리 내에서 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
이 제공하는 주소에서 함수 이름을 가져올 수 없습니다.