Continue após o script python-lldb terminar

Oct 05 2020

Existe uma maneira melhor de emitir o comando continue , depois que meu python-lldbscript terminar?

def HelloWorld(debugger, command, result, internal_dict):
    """
        HelloWorld function. It will print "Hello World", regardless of where lldb stopped.
        Auto-Continues after script has ran.
    """
    target = debugger.GetSelectedTarget()
    process = target.GetProcess()
    print("[*] Hello World from :{}".format(process))
    process.Continue()

O exemplo devolve o controle ao aplicativo, mas não tenho mais o lldbconsole interativo .

As respostas nesta página não ajudaram: LLDB: continue silenciosamente após a execução do script python

Nota lateral: mesmo comportamento se anexar via XCodeou Terminal.

Respostas

1 JimIngham Oct 05 2020 at 19:23

O lldb pode ser executado em dois modos "síncrono" ou "assíncrono".

No modo assíncrono, todos os comandos de controle de execução (etapa, próximo, etc.) são concluídos e retornam o controle ao lldb assim que o depurado começa a executar.

No modo síncrono, os comandos de controle de execução esperam que o processo pare antes de retornar.

O comportamento correto de sincronização / assíncrona é descoberto heuristicamente pelo lldb, mas também pode ser definido manualmente usando a SBDebugger.SetAsyncAPI.

Ao executar um comando lldb apoiado em Python, o lldb se define no modo síncrono. Geralmente é isso que você deseja, por exemplo, se você deseja que seu comando execute uma etapa, verifique algo e execute outra etapa, você não gostaria que o primeiro stepcomando retornasse antes que a etapa real do processo fosse concluída ou sua ação "verificar algo" aconteceria muito cedo.

No entanto, se você quiser que seu comando retorne o controle imediatamente após continuar, sem esperar que o processo pare, você pode chamar debugger.SetAsync(True)logo antes do final process.Continue()em seu comando baseado em Python.

Observe, há uma outra complicação nesta história. Quando um processo é iniciado pelo lldb, o comportamento padrão é compartilhar o terminal com o depurado. Portanto, enquanto o processo estiver em execução, ele será o proprietário do terminal e, até que o processo pare, você não verá um prompt lldb (que sobrescreveria a saída do processo) nem teria uma maneira de inserir comandos. Se quiser que o depurador esteja ativo e aceitando comandos enquanto o processo está em execução, é necessário fornecer ao lldb e ao aplicativo terminais separados. No lldb, use process launch --ttye no Xcode há um conjunto de botões de opção na guia Opções do esquema Executar que permite escolher um terminal separado em vez de usar o console Xcode.

A propósito, pela sua nota, pareceu que o processo que você obteve do argumento exe_ctx (que você omitiu nesta versão) não estava funcionando para você? Mas talvez isso seja confundido com outros problemas. Se eu SetAsync (True) antes de continuar, continuar exe_ctx.processfunciona bem para mim.

E, finalmente, se o seu comando Python mudar o estado do processo de interrompido para em execução, você deve informar ao lldb que chamando:

result.SetStatus(lldb.eReturnStatusSuccessContinuingResult)

ou

result.SetStatus(lldb.eReturnStatusSuccessContinuingNoResult)

Isso é importante se o seu comando for usado em um retorno de chamada de ponto de interrupção ou stop-hook, onde lldb usa o resultado para rastrear se o comando breakpoint ou stop hook forçadamente reiniciou o destino.