Chroot

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

  • September 3, 2016

我正在我的 jessie:x86_64 系統上使用qemu 使用者仿真執行 wheezy:armhf chroot。不知何故,git clone特定私有儲存庫上的 a 將掛在 chroot 內,而本機成功。這可能是一個錯誤,誰知道呢?為了提高我的業力,我想知道這是怎麼回事!

作為旁注:我正在經歷的掛起發生在 jessie:armel chroot 內部的 git-2.0 中……掛起不會發生在全系統仿真中。所以我繼續在wheezy:armhf rabbithole 中探勘,只是因為我必須選擇一個……我無法在本機機器上測試……

所以。沒有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-documentation,設置DEB_CFLAGS_APPENDDEB_CXXFLAGS_APPEND額外的-fno-stack-protector不需要,但無論如何,要確定)

然後,在我正在做的 chroot中使用 qemu 的內置gdb_stub :

QEMU_GDB=1234 git clone /path/to/breaking/repo /tmp/bla

在 qemu 中進行調試會引發不受支持的 syscal 26錯誤。

在chrootgdb-multiarch之外啟動,以進行連接:

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?

給一個continue讓複製發生將導致掛起,發送一個ctrl-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。

事實證明,“git clone”的這個特殊問題是一個與 qemu 相關的問題…… qemu-user-emulation 中的其他問題占主導地位,所以我不得不退回到全系統仿真…… ;-(

使用qemu-user-static從他們的 git 編譯的 a (目前在 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

所以…

但是,我仍然無法獲得複雜程序的回溯……

引用自:https://unix.stackexchange.com/questions/129366