作者:张华 发表于:2016-02-25
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
( http://blog.csdn.net/quqi99 )
使用gdb或者crash时需要debug symbols, 可以从http://ddebs.ubuntu.com/pool/main/l/linux/(NOTE: 此链接只是GA Kernel的debug symbols, 如果是HWE Kernel的符号表一般通过google查找,见本文最下方说明)下载,如果这个网址没有,版本不一样crash就打不起来,所以得自己build一个(https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel, https://wiki.ubuntu.com/Kernel/Dev/KernelGitGuide, https://wiki.edubuntu.org/Kernel/Dev/KernelBugFixing)。
注意:即使自己build也不能保证每次compile的時候symbol address都一样, GCC的版本也有不同。实际上,如果从http://ddebs.ubuntu.com/pool/main/l/linux/找不着对应的GA Kernel的符号表,也找不着HWE Kernel的符号表的话。我们只能自己编译,但是自己编译也是没用的。自己编译的目的只是为了让crash运行起来,里面的symbols是无法相信的,只能用二进制知识直接看memory。
但有时候里面没有需要自己生成,下需方法使用了debian/rules脚本来为Ubuntu Kernel生成debug symbols, 所以它不需要注释的那些make命令, 这个脚本会自动生成.config文件,如果要修改可以使用fakeroot debian/rules editconfigs命令。如果使用的是社区的Kernel, 默认的.config文件应该未包括了生成debug symbols的配置(CONFIG_KALLSYMS=y & CONFIG_KALLSYMS_ALL=y, 路径为:Kernel hacking -> Compile-time checks and compiler options -> Compile the kernel with debug info )。
注:在xenial中也可以可以build trusty的,kernel与上层应用不同,kernel依赖的包很少,这样只要在xenial将相应的依赖安装了就可以build trusty。所以编译kennel不需要像上层应用的编译那样搞什么pbuilder等。
http://kernel.ubuntu.com/~kernel-ppa/mainline/
git config --add core.compression -1 #For the error 'git index-pack failed'
git clone git://kernel.ubuntu.com/ubuntu/linux.git ubuntu-linux
#git clone --reference ubuntu-linux git://kernel.ubuntu.com/ubuntu/ubuntu-vivid.git
git clone --reference ubuntu-linux git://kernel.ubuntu.com/ubuntu/ubuntu-xenial.git
git clone git://kernel.ubuntu.com/ubuntu/linux.git
#git clone --reference linux git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/bionic
#git checkout -b sfxxxx origin/master
#git cherry-pick -s -x commit_id
#git remote add linus git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
#git remote -v
#git fetch --tags linus
#git remote add rotom_xenial zhhuabj@10.230.56.3:/home/zhhuabj/ubuntu-xenial
#git push rotom_xenial sfxxxx
cd ubuntu-xenial
git tag -l Ubuntu-*
git checkout -b Ubuntu-4.4.0-0.10 Ubuntu-4.4.0-0.10
sudo apt-get install libncurses5-dev qt4-dev-tools kernel-package fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge libelf-dev asciidoc binutils-dev
sudo apt-get build-dep linux-image-$(uname -r) #需要添加附录中的deb-src源
sudo apt-get install pkg-config-dbgsym #xenial
#make xconfig #or make menuconfig
#make localmodconfig #speed compliling time for test
#make-kpkg #a script which automates and replaces the sequence "make dep; make clean; make bzImage; make modules"
#make mrproper
#git reset --hard HEAD
fakeroot debian/rules clean
#fakeroot debian/rules editconfigs
#fakeroot debian/rules prepare-generic
#debian/rules build-generic #build kernel
fakeroot debian/rules DEB_BUILD_OPTIONS=parallel=4 clean binary-generic binary-headers skipdbg=false
自己调试机运行的什么版本的kernel和客户运行的没有关系,只需要使用--mod参数指定和客户运行的debug symbol的版本一致即可。
wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-4.13.0-37-generic-dbgsym_4.13.0-37.42_amd64.ddeb -O /home/zhhuabj/debs/4.13.0-37.42/linux-image-4.13.0-37-generic-dbgsym_4.13.0-37.42_amd64.ddeb
strings vmcore.201803282124 |less #NOTE: vmcore may first need to unzip
dpkg -x linux-image-4.13.0-37-generic-dbgsym_4.13.0-37.42_amd64.ddeb /home/zhhuabj/debs/4.13.0-37.42/
cat run_crash.sh
exec crash --mod /home/zhhuabj/debs/4.13.0-37.42/usr/lib/debug/lib/modules/4.13.0-37-generic /home/zhhuabj/debs/4.13.0-37.42/usr/lib/debug/boot/vmlinux-4.13.0-37-generic vmcore.201803282124
注意:上面的方法可能不成功,例如,4.13.0-37是artful的GA Kernel,但对于xenial来说是HWE Kernel。sosreport中的uname显示版本号(上面是通过strings命令查看的版本号,似乎不能显示更详细的版本号)是“4.13.0-37-generic #42~16.04.1”,这种版本号就是在xenial中使用4.13.0-37 hwe kernel。所以正确的debug symbol应该是:https://launchpad.net/~canonical-kernel-team/+archive/ubuntu/ppa/+build/14432003/+files/linux-image-4.13.0-37-generic-dbgsym_4.13.0-37.42~16.04.1_amd64.ddeb
继续遇到此问题“crash: cannot resolve "init_level4_pgt" “ - https://bugs.launchpad.net/ubuntu/+source/crash/+bug/1736425,在xenial中添加'deb http://archive.ubuntu.com/ubuntu/ bionic main'升级crash后解决。
附录:为UCA包编译近似的符号表
UCA缺乏debug symbol,例如为trusty上的mitaka uca的qemu包构建debug symbol,因为都是ppa编译的其编译器版本及设置都差不多这样编译出的debug symbol还可以近似地去用。
1, PPA中有"Build debug symbols"的选项(https://launchpad.net/~zhhuabj/+archive/ubuntu/trusty-mitaka-sru/+edit),再在 "Add PPA dependency"里添加"~ubuntu-cloud-archive/+archive/ubuntu/mitaka-staging"
2, 进这个页面(https://launchpad.net/~ubuntu-cloud-archive/+archive/ubuntu/mitaka-staging),点击"View package details" -> "copy packages",在搜索框输入qemu并同时将其后的下拉列表从Published改为Superseded这样就可以选择客户所用的qemu版本。