Backtrace de "git clone" rodando dentro de arm-chroot baseado em emulação de usuário qemu

Backtrace de "git clone" rodando dentro de arm-chroot baseado em emulação de usuário qemu

Estou executando um chroot wheezy:armhf usandoemulação de usuário qemuno meu sistema jessie:x86_64. De alguma forma, um git clonerepositório privado específico ficará suspenso dentro do chroot, mas terá sucesso nativo. Isso pode ser um bug, quem sabe? Para melhorar meu carma, quero descobrir o que está acontecendo!

Como observação lateral: o travamento que estou enfrentando também está ocorrendo com o git-2.0 dentro de jessie:armel chroot ... O travamento não ocorre dentro de uma emulação de sistema completo. Então continuei cavando nochiado: armhfburaco do coelho, só porque tive que escolher um... não posso testar em uma máquina nativa...

Então. Não há git-dbgpacote, eu rolo o meu próprio. Dentro do chroot wheezy:armhf:

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

Pelo que lidocumentação do gcc, configurar DEB_CFLAGS_APPENDe DEB_CXXFLAGS_APPENDadicionalmente com -fno-stack-protectornão é necessário, mas de qualquer forma, quero ter certeza)

Então, usando o builtin do qemugdb_stubdentro do chroot que estou fazendo:

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

A depuração dentro do qemu lança umsyscal 26 não suportadoerro.

Iniciando gdb-multiarchfora do chroot, para conectar:

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?

Dar um continuepara permitir que o clone aconteça resultará em um travamento, o envio de um ctrl-c será ignorado.

Gerar um arquivo principal e carregá-lo no gdb (dentro do chroot) me dará uma pilha corrompida:

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?)

Agora estou perdido.

Onde está o problema? Perdi algum detalhe na emulação do qemu-user? Tenho que usar um braço-máquina totalmente emulado? Um mal-entendido na depuração cruzada? Limitações do gdb-multiarch? A criação de pacotes de depuração?

Obrigado por quaisquer sugestões, sugestões, sugestões, sugestões, comentários e outros enfeites.

Meu melhor palpite no momento é baseado no fato de que gitele faz um clone (posso ver dois processos/threads), mas a QEMU_GDBvariável de ambiente não é definida pelo qemu após o uso. Portanto, apenas o processo inicial irá para o gdb. Veraquipor exemplo.

Mas ainda assim: devo ser capaz de depurar adequadamente o processo pai? Posso facilmente fazer a depuração cruzada de um MWE hello-world.

Responder1

Acontece que esse problema específico de "git clone" é um problema relacionado ao qemu... Outros problemas na emulação do usuário qemu prevalecem, então tenho que voltar para a emulação de sistema completo... ;-(

Usando a qemu-user-static, compilado a partir de seu git (o qemu-2.0.0+dfsg-4+b1 atualmente em jessie tem menos correções e não funcionará no meu caso...):

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

então...

No entanto, ainda não consigo rastrear programas complexos...

informação relacionada