![我的 Ubuntu 安装上的 vmlinux 在哪里?](https://linux22.com/image/1220256/%E6%88%91%E7%9A%84%20Ubuntu%20%E5%AE%89%E8%A3%85%E4%B8%8A%E7%9A%84%20vmlinux%20%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%9F.png)
我正在尝试创业轮廓,我在这一步遇到了一个问题:
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
哪一个是我要找的?
答案1
它应该在您的/boot
目录中 - mu Ubuntu 实际上有类似的压缩版本vmlinuz-2.6.28-16-generic
。
我无法回答 oprofile 是否可以与它们配合使用。
答案2
在 Ubuntu 下获取的最简单(且非黑客)的方法vmlinux
是添加 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)
答案3
嗯,我只是想把这个作为对 @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
希望这些能帮到你,
干杯!
答案4
这是一个老问题,旧的答案对我来说不再有用(ubuntu 14.04)。
首先,
vmlinux
是可选的oprofile
,您只需要它来显示内核内部发生的情况,没有它就可以进行用户空间分析。更多内容请阅读文档。如果你还需要
vmlinux
,添加 ddebs 存储库(厚颜无耻地来自 ubuntu 的 wiki):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
然后为你的内核安装调试符号。每次升级内核后,都必须执行此操作,以便
uname
获取正确的内核版本。请随意删除与旧内核相关的软件包。sudo apt-get update sudo apt-get install linux-image-$(uname -r)-dbgsym
安装此包后,你可以在这里找到该
vmlinux
文件:/usr/lib/debug/boot/vmlinux-$(uname -r)