16

Я пытаюсь поработать с запуском oprofile, и на этом этапе я столкнулся с проблемой:

opcontrol --vmlinux=/path/to/vmlinux

В Ubuntu нет пакета с именем vmlinux, и когда я выполняю locate vmlinux , я получаю много файлов:

/usr/src/linux-headers-2.6.28-14/arch/h8300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-14/arch/m68k/kernel/vmlinux-std.lds
/usr/src/linux-headers-2.6.28-14/arch/m68k/kernel/vmlinux-sun3.lds
/usr/src/linux-headers-2.6.28-14/arch/mn10300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-14/arch/sh/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-14/arch/x86/boot/compressed/vmlinux_32.lds
/usr/src/linux-headers-2.6.28-14/arch/x86/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-14/include/asm-generic/vmlinux.lds.h
/usr/src/linux-headers-2.6.28-15/arch/h8300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-15/arch/m68k/kernel/vmlinux-std.lds
/usr/src/linux-headers-2.6.28-15/arch/m68k/kernel/vmlinux-sun3.lds
/usr/src/linux-headers-2.6.28-15/arch/mn10300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-15/arch/sh/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-15/arch/x86/boot/compressed/vmlinux_32.lds
/usr/src/linux-headers-2.6.28-15/arch/x86/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-15/include/asm-generic/vmlinux.lds.h
/usr/src/linux-headers-2.6.28-16/arch/h8300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-16/arch/m68k/kernel/vmlinux-std.lds
/usr/src/linux-headers-2.6.28-16/arch/m68k/kernel/vmlinux-sun3.lds
/usr/src/linux-headers-2.6.28-16/arch/mn10300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-16/arch/sh/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-16/arch/x86/boot/compressed/vmlinux_32.lds
/usr/src/linux-headers-2.6.28-16/arch/x86/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-16/include/asm-generic/vmlinux.lds.h

Какой из них я ищу?

9 ответов9

24

Самый простой (и не хакерский) способ получить vmlinux под Ubuntu - это добавить репозиторий ddebs:

echo "deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
sudo tee -a /etc/apt/sources.list.d/ddebs.list

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01

и установите символы отладки ядра:

sudo apt-get update
sudo apt-get install linux-image-$(uname -r)-dbgsym

vmlinux можно найти здесь:

/usr/lib/debug/boot/vmlinux-$(uname -r)
12

Хм, просто хотел поместить это как комментарий к ответу выше по @paxdiablo, но не можете найти кнопку комментария? В любом случае ..

Дело в том, что файл vmlinuz сжимается - и для целей отладки вам нужен несжатый vmlinux (и желательно, созданный с отладочными символами - чего нет у vmlinuz по умолчанию, поставляемого с Ubuntu, так как они лишены символов),

Теперь можно распаковать vmlinuz в файл vmlinux - однако это не тривиально; сначала вы должны найти смещение байтов в vmlinuz где начинается сжатый файл, а затем использовать dd и zcat чтобы распаковать только необходимую часть. Подробно это объясняется в: « [ubuntu] Как отследить эту ошибку? - Форумы Ubuntu - пост № 4 »; вкратце, ниже приведен пример журнала команд терминала, основанный на этом посте:

$ od -A d -t x1 /boot/vmlinuz-$(uname -r) | grep '1f 8b 08 00' --colour
0013920 f3 a5 fc 5e 8d 83 70 23 3d 00 ff e0 *1f 8b 08 00*

$ wcalc 13920+12
 = 13932

$ dd if=/boot/vmlinuz-$(uname -r) bs=1 skip=13932 | zcat > vmlinux-$(uname -r)
4022132+0 records in
4022132+0 records out
4022132 bytes (4,0 MB) copied, 42,1695 s, 95,4 kB/s

gzip: stdin: decompression OK, trailing garbage ignored


$ file vmlinux-2.6.32-25-generic 
vmlinux-2.6.32-25-generic: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped

Ну, надеюсь, это поможет,

Ура!

3

Вы можете скачать исходный код и скомпилировать свой собственный, используя следующую команду:

apt-get source linux-image-$(uname -r)
apt-get build-dep --no-install-recommends linux-image-$(uname -r)
cd linux-2.6.32/
fakeroot make -f debian/rules binary-generic skipdbg=false  

или вы можете скачать пакет ddeb здесь и установить его с помощью sudo dpkg -i linux-image-3.2.0-60-virtual-dbgsym_3.2.0-60.91_amd64.ddeb

2

Он должен находиться в вашем каталоге /boot - на самом деле mu Ubuntu имеет сжатые версии в духе vmlinuz-2.6.28-16-generic .

Может ли oprofile работать с ними - это не вопрос, на который я могу ответить.

2

Это старый вопрос, и старые ответы у меня больше не работают (Ubuntu 14.04).

  1. Прежде всего, vmlinux необязателен для oprofile, он нужен только для того, чтобы показать, что происходит внутри ядра, профилирование пользовательского пространства может быть выполнено без него. Подробнее читайте в док.

  2. Если вам все еще нужен vmlinux , добавьте репозиторий ddebs (бессовестно взятый из вики Ubuntu):

    codename=$(lsb_release -c | awk  '{print $2}')
    sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
    deb http://ddebs.ubuntu.com/ ${codename} main restricted universe multiverse
    deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse
    deb http://ddebs.ubuntu.com/ ${codename}-updates  main restricted universe multiverse
    deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse
    EOF
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECDCAD72428D7C01
    
  3. Затем установите символы отладки для вашего ядра. Вы должны делать это каждый раз, когда обновляете свое ядро, после перезагрузки, чтобы uname правильную версию ядра. Не стесняйтесь удалять пакеты, связанные со старыми ядрами.

    sudo apt-get update
    sudo apt-get install linux-image-$(uname -r)-dbgsym
    
  4. После установки этого пакета вы найдете файл vmlinux здесь:

    /usr/lib/debug/boot/vmlinux-$(uname -r)
    
0

Пакеты, содержащие ядро linux (файл vmlinuz), называются linux-image-VERSION-ARCH в Debian/Ubuntu.

Вы можете перечислить их с помощью команды dpkg -l linux-image-* , а для установленного пакета (в первом столбце он отмечен значком ii ) вы можете получить список файлов с помощью dpkg -L linux-image-VERSION-ARCH , например: dpkg -L linux-image-2.6.31-17-386 для последней установки Karmic.

Обратите внимание, что l в нижнем регистре в первой команде и в верхнем регистре во второй.

0

Попробуйте следующую команду:

apt-get linux-image.*-dbg

обычно vmlinux находится в /usr /lib /debug / после установки

-1

это должно быть в вашем корне (/). В Ubuntu 8.10 это ссылка, указывающая на /boot/vmlinuz-2.6.28-16-generic

сделать

ls / -l | grep '^l'

ты должен найти это

PS: не уверен в точном имени пути.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .