как найти функцию в разделяемой библиотеке из журнала сбоя приложения - PullRequest
0 голосов
/ 11 декабря 2011

Вот часть вывода из журнала ядра после сбоя приложения:

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 и ПК на 0x296313a4)?

Ответы [ 3 ]

1 голос
/ 11 декабря 2011

Библиотека, загруженная по самому высокому адресу: 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 в вашей системе.

1 голос
/ 11 декабря 2011

Вы можете найти смещения каждой функции в .so, используя objdump.Обычно я просто использую ключ -S, так как он будет отображать источник, когда он у вас есть, а также будет выполнять базовую разборку.

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

Если вы знаете базовый адрес, в который загружена библиотека, выЗатем можно вычислить фактические местоположения.

0 голосов
/ 20 декабря 2011

Спасибо за вашу помощь, ребята.Я уверен, что ответы могут помочь другим программистам.Но в моем случае проблема, кажется, более специфична для конкретной платформы (sh4 ST-Linux).Поэтому вопрос нужно задать на сайте ST или в bugzilla.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...