我正在运行 wheezy:armhf chroot 使用qemu 用户模拟在我的 jessie:x86_64 系统上。不知何故,git clone
特定私有存储库上的 a 将挂在 chroot 内,同时在本机上成功。这可能是一个错误,谁知道呢?为了提高自己的业力,我想弄清楚到底是怎么回事!
顺便说一句:我遇到的挂起也是在 jessie:armel chroot 内的 git-2.0 中发生的......挂起不会发生在全系统模拟中。所以我继续挖掘喘息声:armhf兔子洞,只是因为我必须选择一个......我无法在本机机器上进行测试......
所以。没有git-dbg
包,我自己卷的。在 wheezy:armhf chroot 中:
sudo apt-get install build-essential fakeroot
sudo apt-get build-dep git
apt-get source git && cd git-1.7.10.4
DEB_CFLAGS_APPEND="-fno-stack-protector" DEB_CXXFLAGS_APPEND="-fno-stack-protector" DEB_BUILD_MAINT_OPTIONS=hardening=-stackprotector,-fortify DEB_BUILD_OPTIONS="noopt nostrip nocheck" fakeroot dpkg-buildpackage -j´getconf _NPROCESSORS_ONLN`
sudo dpkg -i ../git_1.7.10.4-1+wheezy1_armhf.deb
据我读到gcc 文档,设置DEB_CFLAGS_APPEND
和DEB_CXXFLAGS_APPEND
另外 with-fno-stack-protector
是不需要的,但无论如何,要确定)
然后,使用 qemu 的内置gdb_存根在 chroot 里面我正在做:
QEMU_GDB=1234 git clone /path/to/breaking/repo /tmp/bla
在 qemu 内部调试会抛出一个不支持的系统 26错误。
gdb-multiarch
在 chroot 之外启动,进行连接:
gdb-multiarch -q
(gdb) set architecture arm # prevents "warning: Architecture rejected target-supplied description"
(gdb) target remote localhost:1234
(gdb) set sysroot /opt/chroots/wheezy:armhf
(gdb) file /opt/chroots/wheezy:armhf/usr/bin/git
Reading symbols from /opt/chroots/wheezy:armhf/usr/bin/git...done. # good! has debug symbols!
(gdb) list # works! code is not stripped
(gdb) step
Cannot find bounds of current function # meh...
(gdb) backtracke
#0 0xf67e0c90 in ?? ()
#1 0x00000000 in ?? () # wtf?
发送 acontinue
让克隆发生将导致挂起,发送 actrl-c
将被忽略。
生成核心文件并将其加载到 gdb(在 chroot 内)将给我一个损坏的堆栈:
gdb -q /usr/bin/git qemu_git_20140514-160951_22373.core
Reading symbols from /usr/bin/git...done.
[New LWP 22373]
Cannot access memory at address 0xf67fe948
Cannot access memory at address 0xf67fe944
(gdb) bt
#0 0xf678b3e4 in ?? ()
#1 0xf678b3d4 in ?? ()
#2 0xf678b3d4 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
现在我迷路了。
哪里有问题?我是否错过了 qemu-user-emulation 中的一些细节?我必须使用完全模拟的手臂机器吗?交叉调试的误区? gdb-multiarch 限制?创建调试包?
感谢您提供任何建议、指点、提示、提示、评论以及诸如此类的信息。
我目前最好的猜测是基于git
执行克隆的事实(我可以看到两个进程/线程),但QEMU_GDB
使用后 qemu 未设置环境变量。因此,只有初始进程才会进入 gdb。看这里例如。
但仍然:我应该能够正确调试父进程?我可以轻松地交叉调试 hello-world MWE。
答案1
事实证明,“git clone”的这个特殊挂起是一个与 qemu 相关的问题...qemu-user-emulation 中的其他问题占主导地位,所以我必须退回到全系统模拟...;-(
使用qemu-user-static
从他们的 git 编译的(目前在 jessie 中的 qemu-2.0.0+dfsg-4+b1 修复较少,并且不适用于我的情况...):
git clone git://git.qemu-project.org/qemu.git $HOME/qemu.git && cd $HOME/qemu.git
./configure --static --disable-system --target-list=arm-linux-user --prefix=$HOME/qemu.install --disable-libssh2
make && make install
sudo cp $HOME/qemu.install/bin/qemu-arm /opt/chroots/wheezy:armhf/usr/bin/qemu-arm-static
所以...
但是,我仍然无法获得复杂程序的回溯......