Pergunta

Estou tentando depurar o que parece ser um problema de fila de conclusão:

Apr 14 18:39:15 ST2035 kernel: Call Trace:
Apr 14 18:39:15 ST2035 kernel:  [<ffffffff8049b295>] schedule_timeout+0x1e/0xad
Apr 14 18:39:15 ST2035 kernel:  [<ffffffff8049a81c>] wait_for_common+0xd5/0x13c
Apr 14 18:39:15 ST2035 kernel:  [<ffffffffa01ca32b>]
ib_unregister_mad_agent+0x376/0x4c9 [ib_mad]
Apr 14 18:39:16 ST2035 kernel:  [<ffffffffa03058f4>] ib_umad_close+0xbd/0xfd

É possível transformar esses números hexadecimais em algo próximo aos números de linha?

Foi útil?

Solução

Não exatamente, mas se você tiver uma imagem VMLINUX construída com informações de depuração, (por exemplo, em Rhel, você poderá instalar o kernel-debug ou o kernel-dbg ou algo assim) você pode se aproximar. Portanto, supondo que você tenha esse arquivo vmlluex disponível. Faça o seguinte:

Objdump -s vmllux

Isso tentará ser mais difícil corresponder ao código do objeto com linhas individuais de código -fonte.

por exemplo, para o seguinte código C:

#include <stdio.h>
main() {
  int a = 1;
  int b = 2;

  // This is a comment

  printf("This is the print line %d\n", b);
} 

compilado com: cc -g test.c

E, em seguida, executando o Objdump -s no executável resultante, recebo uma grande saída descrevendo as várias partes do incluming executável na seção a seguir:

00000000004004cc <main>:
#include <stdio.h>
main() {
  4004cc:   55                      push   %rbp
  4004cd:   48 89 e5                mov    %rsp,%rbp
  4004d0:   48 83 ec 20             sub    $0x20,%rsp
  int a = 1;
  4004d4:   c7 45 f8 01 00 00 00    movl   $0x1,-0x8(%rbp)
  int b = 2;
  4004db:   c7 45 fc 02 00 00 00    movl   $0x2,-0x4(%rbp)

  // This is a comment

  printf("This is the print line %d\n", b);
  4004e2:   8b 75 fc                mov    -0x4(%rbp),%esi
  4004e5:   bf ec 05 40 00          mov    $0x4005ec,%edi
  4004ea:   b8 00 00 00 00          mov    $0x0,%eax
  4004ef:   e8 cc fe ff ff          callq  4003c0 <printf@plt>
} 

Você pode corresponder aos endereços do código do objeto na primeira coluna com os endereços no seu rastreamento de pilha. Combine isso com as informações do número da linha intercaladas na saída da montagem ... e você está lá.

Agora, lembre -se de que isso nem sempre terá sucesso 100% porque o Kenrel é normalmente compilado no nível de otimização -O2 e o compilador teria feito muita reordenação de código etc. Mas se você estiver familiarizado com o código que está Tentando depurar e ter algum conforto ao decifrar a assembléia da plataforma em que você está trabalhando ... você deve ser capaz de definir a maioria dos seus acidentes etc.

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