在基於 qemu-user-emulation 的 arm-chroot 中執行的“git clone”的回溯
我正在我的 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_APPEND
和DEB_CXXFLAGS_APPEND
額外的-fno-stack-protector
不需要,但無論如何,要確定)然後,在我正在做的 chroot中使用 qemu 的內置gdb_stub :
QEMU_GDB=1234 git clone /path/to/breaking/repo /tmp/bla
在 qemu 中進行調試會引發不受支持的 syscal 26錯誤。
在chroot
gdb-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
所以…
但是,我仍然無法獲得複雜程序的回溯……