O que você tem aí é o próprio script de atualização tropeçando em dados inválidos em algum lugar. Você precisa encontrar e remover os dados inválidos.
Nesse caso, foi o pacote veeamsnap
. Remover esse pacote deve consertá-lo. Mas como isso é diferente para cada caso, descreverei os passos dados para chegar a essa conclusão. É um processo bastante complicado.
É divertido, porque as strings de python3 devem estar todas em UTF-8. O que você tem aqui (descoberto depois do fato) é um módulo C ( apt_pkg
) de alguma forma inserindo dados não-UTF-8 em uma string python3, portanto quebrando todas as tentativas de ler a string - observe como o manipulador de erro lançou uma exceção também?
Para o desconhecido depurador , vamos!
A melhor maneira de diagnosticar problemas como este é fazer com que o depurador pause antes da linha falhar. Com o Python, quando você tem uma série de chamadas aninhadas como essa, a maneira mais fácil de adicionar uma pausa do depurador é editá-lo.
-
Usando seu exemplo, podemos ver que a falha em questão está no arquivo
/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeCache.py
line 806, então vamos abrir um editor de texto e ir para essa linha. O caminho temporário será diferente para cada execução, portanto, certifique-se de usar aquele da sua saída de erro! Apartirdaqui,podemosprimeiro
adicionar uma simples pausa no depurador , inserindo import pdb; pdb.set_trace();
na linha 806 apenas antes do erro. Porque este é o Python, o recuo é importante!Agoraprecisamosexecutaroprogramamodificado.Nãoexecute
do-release-upgrade
novamente;Issoprovavelmenteirábaixarumnovo.Vejanoslogsdeerro,aprimeiralinhadepoisde"exceção original"? Aquele com/tmp/ubuntu-release-upgrader-woadaq_z/xenial
? É esse que você quer correr. Então, execute esse arquivo, como root (ou sudo).Em execução, você deve entrar no depurador (pdb):
Apartirdaqui,descobrimosquantospacotesexistemnototal.A
maneira fácil de fazer isso é executar sum(1 for _ in self)
. Espere um pouco (isso pode demorar um pouco) e vai imprimir um número. Nesse caso, foi76028
.Agora, como o erro provavelmente não acontece nos primeiros passos, não queremos passar manualmente pelos pacotes > 75000, e não podemos adicionar um manipulador de exceções (porque o erro é tão ruim que quebra o próprio Python), precisamos de uma alternativa.
-
Remova a linha adicionada no passo 4. Edite o código para imprimir um número incremental para cada pacote. Por exemplo, adicione
foo = 0
acima do loop na linha 802 efoo += 1; print(foo)
na linha 807 (logo antes da linha de erros). Executeocódigonovamente,usandoomesmocomandodaetapa3.Eleimprimiráumagrandelistadenúmeros.Deixe-ocontinuaratéqueoerrosejaimpressonovamente.Podesernecessárioampliarsuajanela:
Esseúltimonúmerodeveseropacoteemqueelecaiu.Fiqueatentoaessenúmero.
Agoraquevocêsabequalpacote/númerocausaafalha,éhoradeadicionarapausadodepuradorcomumacondiçãoparaserexecutadaapenasnessepacote.Porexemplo,sevocêfalharnopacote
72285
,adicioneiffoo==72285:importpdb;pdb.set_trace()
logoapósalinhaqueimprimefoo
:Executeocódigonovamente.Agora,quandovocêentrarem
pdb
,eledeveestarnopacotequecausaafalha.Vocêpodedigitaronomedavariávelpkg
paraimprimirseuvalor,queinformaráonomedopacoteatual:Mais geralmente, digitar o nome de qualquer variável imprimirá sua saída.
-
Remova o pacote ofensivo e tente a atualização novamente (a partir de uma atualização de desbloqueio limpa).