在基于 qemu-user-emulation 的 arm-chroot 中运行的“git clone”的回溯

在基于 qemu-user-emulation 的 arm-chroot 中运行的“git clone”的回溯

我正在运行 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_APPENDDEB_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

所以...

但是,我仍然无法获得复杂程序的回溯......

相关内容