Pergunta

Eu tentei de depuração remota uma aplicação de 32 bits em x86_64 SUSE Linux, mas recebo este erro "remoto registo mal formatado".

Eu iniciar o gdbserver como escutando na porta 12345 (gdbserver localhost: 12345 my_prog)

E este é o erro:

$ gdb
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-suse-linux".
(gdb) target remote <ip>:12345
Remote debugging using <ip>:12345
Remote register badly formatted: T0506:0000000000000000;07:80b8bcff00000000;10:4028f0f700000000;
here: 0000000;07:80b8bcff00000000;10:4028f0f700000000;
(gdb)

Esta é a máquina do servidor de depuração (uname -a):

servidor Linux 2.6.16.60-0.31-smp # 1 SMP Tue 07 de outubro 16:16:29 UTC 2008 x86_64 x86_64 x86_64 GNU / Linux

E esta é a máquina do cliente de depuração (uname -a):

cliente Linux 2.6.16.54-0.2.5-default # 1 Mon 21 jan 13:29:51 UTC 2008 x86_64 x86_64 x86_64 GNU / Linux

Ambas as máquinas estão rodando em máquinas virtuais embora (VMWare). O binário gdbserver é copiado da máquina do cliente para a máquina do servidor.

(I depuração remota porque o ambiente de tempo de execução no servidor de depuração é a produção, como, e não contém quaisquer ferramentas de desenvolvimento, o acesso ao código-fonte etc.)

Todas as sugestões são bem-vindos.

UPDATE: isso funcionou para mim, emitindo o seguinte comando no gdb:

conjunto de arquitetura i386: x86-64

Foi útil?

Solução

Talvez você precisa executar algo como set architecture i386 no prompt (gdb)? O que faz show architecture digamos depois de ligar para o alvo remoto?

Outras dicas

A 64-bit GDB pode depurar diretamente 32 e 64 bits processos inferiores (eu acredito que isso é chamado de suporte multi-arco).

Não é assim com gdbserver:. Ele não suporta multi-arco depuração

Você precisa de um gdbserver que partidas alvo arquitetura, e gdb que corresponde gdbserver. Construí-los a partir da fonte, configure com --target=i686.

Talvez você já verificou isso, mas aqui vai: - Na máquina de 64 bits, você tem bibliotecas de que 32 bits (libc, etc)? -? Você já tentou correr gdb com o "-nx" (sem arquivos de inicialização) interruptor

1) Você precisa de um gdbserver adequado para a sua máquina de destino e sua máquina host (aquele que se encaixa a máquina de destino no seu caso.

Vamos dizer que eu quero depurar um alvo ppc de um host x86:

Vou precisar do meu alvo um ppc executável gdbserver.

Vou precisar no meu host um gdb executável x86 para PowerPC.

Depois de definir com aquelas coisas que você tem que fazer o seguinte em seu gdb anfitrião antes de ligar para o alvo no caso de você usar bibliotecas compartilhadas:

set solib-absolute-prefixo $ ELDK_PREFIX / eldk-4.2-ppc_4xx / $ CROSS_COMPILE

dir $ ELDK_PREFIX / eldk-4.2-ppc_4xx / $ CROSS_COMPILE

caso contrário o gdb anfitrião vai ficar louco tentando bibliotecas compartilhadas de carga para x86.

Eu acho que você precisa para executar gdb em sua máquina host com uma cópia do programa de destino. Ou seja, se você executar gdbserver myprog em sua máquina-alvo, você precisa copiar myprog ao gdb myprog máquina host e correr.

Desta forma gdb na máquina host irá automaticamente pegar a arquitetura do executável. Correndo gdb no host como este também irá carregar os símbolos, sem a qual você deseja obter símbolos não resolvidos (pontos de interrogação).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top