Localização do problema no Linux

1. Princípio de funcionamento da CPU

 

 

 2. Alocação de memória Linux

 

 

 3. pilha

1). O local onde variáveis ​​locais, parâmetros de função e valores de retorno de função são armazenados.
2). O espaço de pilha de cada thread é contínuo e independente um do outro.
3). Use x /100a $esp para ver o dados originais na memória da pilha

 3. Processo de chamada de função

Como o processo de chamada de função organiza os dados na pilha

 4. Gerenciamento de heap de três níveis

Se você quiser saber mais sobre isso, leia "glibc memory management ptmalloc source code analysis.pdf" e heapdump source code

 5. Coleta de informações

Espaço de pilha de informações do thread Todas as variáveis ​​globais e locais do heap Todas as informações armazenadas no núcleo podem ser extraídas através dos métodos acima

5.1 Visualizar informações de memória

Endereço X /100x

5.2 Ver pilha de chamadas X /100a $esp

5.3 Visualizar variáveis ​​locais

Informações locais

 

5.4 Visualizar variáveis ​​globais

Nome da variável global P

5.5 Ver instância da classe

Símbolo de informação * endereço da instância da classe

P * (nome da classe *) endereço da instância da classe

 5.6 Visualizar contêiner STL

Listar pmap…

 5.7 Ver alocação de memória heap:

 Despejo de pilha –a 

6. Exemplo de solução de problemas

O processo de solução de problemas é o processo de análise e integração de informações. O processo de solução de problemas é o processo de usar de forma abrangente os vários métodos apresentados no Capítulo 2 para coletar informações, cavando a raiz do problema passo a passo e removendo os casulos. Precisa constantemente tentar, levantar hipóteses, verificar. É um tipo de trabalho mental avançado, que requer muita paciência e familiaridade com a estrutura do código original. Às vezes, são necessários vários meses de repetidas demonstrações e verificações para localizar um problema profundo.

O programa trava ocasionalmente? Qual o proximo?

6.1 Observe as pistas dos seguintes arquivos principais

1) O tamanho do núcleo é de cerca de 200M, indicando que a falha não é causada por vazamentos de memória

2) O número do processo é 5030 e o log pode ser associado ao número do processo

3) Erro tipo 11 Falha de segmentação. A descrição é uma exceção de acesso à memória

6.2 Preparando o ambiente Use gdb para abrir o arquivo principal

 1) Instale o kit de ferramentas dss7016_tools.tar.gz para garantir que o heapdump gdb (7.6) esteja instalado

2) Use gdb UMTS.exe ../UMTS_5030-1437863062-11.core -x .gdbinit para abrir o arquivo principal e garantir que o contêiner stl possa ser analisado corretamente

3) Use info sharedlibrary para verificar se a biblioteca está carregada corretamente

 6.3 Confirme a causa superficial do acidente

1) bt trava no construtor CZString::CZString

 2) Desmonte para ver onde ocorreu o acidente

3) registros de informações para ver o valor do registro

 4) A razão superficial confirma que o valor de Mov edx,[eax +0x4] eax está errado, o que leva a um erro

 6.4 Por que o valor de Eax não reverte a primeira pilha de otimização difícil

 

1) O valor do parâmetro __x está errado por quê?

Veja stl_map.h e stl_tree.h

 2) Encontre o valor de __X

 3) Agora pode-se confirmar que o valor neste mapa está errado

4) Por que o valor no mapa está errado? Não há verificação rotineira do processo para pontos superdifíceis.

 

 

  

 5) A causa raiz é que a classe CLiveChannel foi liberada e o bloqueio interno foi manipulado, resultando na destruição da estrutura do mapa do thread 1, resultando em uma falha de segmentação

Acho que você gosta

Origin blog.csdn.net/huapeng_guo/article/details/132494333
Recomendado
Clasificación