Como posso executar o gdb em uma máquina e executar o kernel kgdb em outra máquina?

4

Eu quero rodar duas máquinas:

  1. máquina depurada: kernel compilado com a opção kgdb.
  2. depurador: para executar o gdb

Como posso depurar a máquina 1 da máquina 2?

    
por Milad Khajavi 15.12.2013 / 07:37

2 respostas

2

gdbserver

Parece que você está procurando pelo gdbserver .

gdbserver is a control program for Unix-like systems, which allows you to connect your program with a remote GDB via target remote---but without linking in the usual debugging stub.

Exemplo

Na máquina de destino

You need to have a copy of the program you want to debug. gdbserver does not need your program's symbol table, so you can strip the program if necessary to save space. GDB on the host system does all the symbol handling.

target$ gdbserver host:2345 emacs foo.txt

NOTA: Você também pode anexar a processos em execução da seguinte forma:

target$ gdbserver comm --attach pid

Uma máquina host do GDB

You need an unstripped copy of your program, since GDB needs symbols and debugging information. Start up GDB as usual, using the name of the local copy of your program as the first argument. (You may also need the --baud' option if the serial line is running at anything other than 9600bps.) After that, use target remote to establish communications with gdbserver. Its argument is either a device name (usually a serial device, like/dev/ttyb'), or a TCP port descriptor in the form host:PORT. For example:

   (gdb) target remote the-target:2345

stub do GDB

Existe outro método discutido nos manuais, chamado "stub remoto". Os manuais oficiais estão localizados aqui, Documentação do GDB , no site gnu.org. Consulte o Manual do Usuário do GDB , seção 20.5, Implementando um Remote Stub , explica como usar esse recurso em vez de gdbserver .

Este método é descrito da seguinte forma nos documentos:

The next step is to arrange for your program to use a serial port to communicate with the machine where gdb is running (the host machine). In general terms, the scheme looks like this:

Assim, você pode configurar uma porta serial no host da VM e no convidado e depurar o kernel do convidado usando esse método.

Referências

por 15.12.2013 / 15:33
1

Passo a passo do KGDB + QEMU

Meu exemplo do QEMU + Buildroot é uma boa maneira de ter um gostinho dele sem hardware real: link

Prós e contras versus outros métodos:

  • vantagem vs QEMU:
    • muitas vezes você não tem emulação de software para seu dispositivo, pois os fornecedores de hardware não gostam de lançar modelos de software precisos para seus dispositivos
    • hardware real bem mais rápido que o QEMU
  • vantagem vs JTAG: não há necessidade de hardware JTAG extra, mais fácil de configurar
  • desvantagens vs QEMU e JTAG: menos visibilidade e mais intrusivas. O KGDB confia em certas partes do kernel trabalhando para poder se comunicar com o host. Então, por exemplo, quebra em pânico, você não pode ver a seqüência de inicialização.

Os principais passos são:

  1. Compile o kernel com:

    CONFIG_DEBUG_KERNEL=y
    CONFIG_DEBUG_INFO=y
    
    CONFIG_CONSOLE_POLL=y
    CONFIG_KDB_CONTINUE_CATASTROPHIC=0
    CONFIG_KDB_DEFAULT_ENABLE=0x1
    CONFIG_KDB_KEYBOARD=y
    CONFIG_KGDB=y
    CONFIG_KGDB_KDB=y
    CONFIG_KGDB_LOW_LEVEL_TRAP=y
    CONFIG_KGDB_SERIAL_CONSOLE=y
    CONFIG_KGDB_TESTS=y
    CONFIG_KGDB_TESTS_ON_BOOT=n
    CONFIG_MAGIC_SYSRQ=y
    CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
    CONFIG_SERIAL_KGDB_NMI=n
    

    A maioria deles não é obrigatória, mas é isso que testei.

  2. Adicione ao seu comando QEMU:

    -append 'kgdbwait kgdboc=ttyS0,115200' \
    -serial tcp::1234,server,nowait
    
  3. Execute o GDB com a partir da raiz da árvore de código-fonte do kernel do Linux com:

    gdb -ex 'file vmlinux' -ex 'target remote localhost:1234'
    
  4. No GDB:

    (gdb) c
    

    e o boot deve terminar.

  5. No QEMU:

    echo g > /proc/sysrq-trigger
    

    E o GDB deve quebrar.

  6. Agora terminamos, você pode usar o GDB como de costume:

    b sys_write
    c
    

Testado no Ubuntu 14.04.

KGDB + Raspberry Pi

A configuração exatamente igual a acima quase funcionou em um Raspberry Pi 2, Raspbian Jessie 2016-05-27.

Você apenas tem que aprender a fazer as etapas do QEMU no Pi, que são facilmente Googlable:

  • adicione as opções de configuração e recompile o kernel conforme explicado no link . infelizmente faltando opções na construção do kernel padrão, notavelmente sem símbolos de depuração, então a recompilação é necessária.

  • edite cmdline.txt da partição de inicialização e adicione:

    kgdbwait kgdboc=ttyAMA0,115200
    
  • conecte gdb ao serial com:

    gdb -ex 'file vmlinux' -ex 'target remote /dev/ttyUSB0'
    

    Se você não está familiarizado com a série, confira: link Tudo o que você precisa é de um adaptador barato como este . Certifique-se de que você pode obter um shell através da serial para garantir que está funcionando antes de experimentar o KGDB.

  • faça:

    echo g | sudo tee /proc/sysrq-trigger
    

    de dentro de uma sessão SSH, já que o serial já é tomado pelo GDB.

Com essa configuração, consegui colocar um ponto de interrupção em sys_write , pausar a execução do programa, listar a origem e continuar.

No entanto, algumas vezes, quando eu fiz next in sys_write GDB apenas desliguei e imprimi esta mensagem de erro várias vezes:

Ignoring packet error, continuing...

, então não tenho certeza se algo está errado com a minha configuração, ou se isso é esperado por causa do que alguns processos em segundo plano estão fazendo na imagem Raspbian mais complexa.

    
por 28.05.2017 / 12:46