여기

2011-12-10 2 views
0

응용 프로그램 충돌 후 커널 로그 출력의 일부 응용 프로그램 충돌 로그에서 공유 라이브러리 함수를 찾는 방법 :여기

kernel: [ 252.772000] testsnd/972: potentially unexpected fatal signal 11. 
... 
kernel: [ 252.788000] PC is at 0x296313a4 
... 
kernel: [ 252.820000] mmap = 0x00400000->testsnd 0x29558000->ld-2.10.1.so 0x29580000->libpthread-2.10.1.so 0x295a8000->libdl-2.10.1.so 0x295bc000->librt-2.10.1.so 0x295d4000->libc-2.10.1.so 

응용 프로그램이 libc의 추락했다. 이 정보 (0x295d4000->libc-2.10.1.so 및 PC는 0x296313a4)를 사용하여 충돌이 발생한 함수 이름을 얻는 방법은 무엇입니까?

답변

1

objdump를 사용하여 .so에서 각 함수의 오프셋을 찾을 수 있습니다. 나는 일반적으로 -S 스위치를 사용한다. 소스 스위치를 가지고있을 때 소스를 보여줄 것이고, 기본 디스 어셈블리도 할 것이다.

objdump -SR /lib/i386-linux-gnu/libc-2.13.so 

라이브러리가로드되는 기본 주소를 알고 있으면 실제 위치를 계산할 수 있습니다.

+0

"기본 주소를 알고 있다면 ..."이것은 * 정확하게 * 커널 메시지가 제공 한 것입니다. '0x296313a4 '주소는'0x295d4000'에로드 된'libc-2.10.1.so'에 매핑됩니다. –

+0

이것은 완벽합니다. 전에 objdump -x와 -d를 사용 했었지만, -SR이 훨씬 뛰어났습니다. 디버그가 켜져있을 때 C++ 코드를 보여줍니다! –

1

가장 높은 주소에로드 된 라이브러리는 libc-2.10.1.so이고 0x295d4000입니다.

perl -e 'printf "0x%x\n", 0x296313a4 - 0x295d4000' 
0x5d3a4 

addr2line -fe /lib/libc.so.6 0x5d3a4 

... libc debuginfo 패키지가 설치되어 있으면 함수 이름과 파일/행 정보를 출력해야합니다. /lib/libc.so.6을 실제 시스템의 64 비트 libc.so.6 위치로 대체해야 할 수 있습니다.

+0

@Andy libc.so.6에서'nm -D'를 사용하면 함수 (이 경우 0x5d3a4 주소는 1 안에 있음)를 알 수 있습니다. 이것은 디버그 정보 없이도 결정할 수 있습니다. 하지만 PC가 어디에 있는지에 대한 정확한 명세를 위해서는 실제로 디버그 정보가 필요합니다. –

0

도움 주셔서 감사합니다. 답변이 다른 프로그래머에게 도움이 될 것입니다. 하지만 제 경우에는 문제가 더 특정 플랫폼 (sh4 ST-Linux) 인 것 같습니다. 따라서 ST 웹 사이트 또는 bugzilla에서 질문을해야합니다.