python-lldb 스크립트가 완료된 후 계속
스크립트가 완료된 후 continue 명령을 실행 하는 더 좋은 방법이 python-lldb있습니까?
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()
이 예제는 앱에 대한 제어권을 다시 부여하지만 더 이상 대화 형 lldb콘솔 이 없습니다 .
이 페이지의 답변은 도움이되지 않았습니다. LLDB : Python 스크립트 실행이 완료된 후 자동으로 계속
사이드 노트 : XCode또는을 통해 첨부하는 경우 동일한 동작 Terminal.
답변
lldb는 "동기"또는 "비동기"모드로 실행할 수 있습니다.
비동기 모드에서는 모든 실행 제어 명령 (단계, 다음 등)이 완료되고 디버깅 대상이 실행을 시작하자마자 제어를 lldb에 반환합니다.
동기 모드에서 실행 제어 명령은 반환하기 전에 프로세스가 중지 될 때까지 기다립니다.
올바른 동기화 / 비동기 동작은 lldb에 의해 경험적으로 파악되지만 SBDebugger.SetAsyncAPI를 사용하여 수동으로 설정할 수도 있습니다 .
Python 지원 lldb 명령을 실행할 때 lldb는 자신을 동기 모드로 설정합니다. 이는 일반적으로 원하는 것입니다. 예를 들어 명령이 단계를 수행하고 무언가를 확인하고 다른 단계를 수행하려는 step경우 프로세스의 실제 단계가 완료되거나 "뭔가 확인"작업이 완료되기 전에 첫 번째 명령이 반환 되는 것을 원하지 않습니다. 너무 빨리 일어날 것입니다.
그러나 명령이 프로세스가 중지 될 때까지 기다리지 않고 계속 한 직후에 제어를 반환하도록하려면 Python 지원 명령에서 debugger.SetAsync(True)최종 직전에 호출 할 수 있습니다 process.Continue().
이 이야기에는 또 다른 문제가 있습니다. lldb에 의해 프로세스가 시작될 때 기본 동작은 터미널을 디버그 대상과 공유하는 것입니다. 따라서 프로세스가 실행되는 동안 터미널을 소유하게되며 프로세스가 중지 될 때까지 lldb 프롬프트 (프로세스 출력을 덮어 쓰기)가 표시되지 않거나 명령을 입력 할 방법이 없습니다. 디버거를 활성화하고 프로세스가 실행되는 동안 명령을 수락하려면 lldb 및 앱에 별도의 터미널을 제공해야합니다. lldb에서 사용 process launch --tty하고 Xcode에는 Xcode 콘솔을 사용하는 대신 별도의 터미널을 선택할 수있는 실행 체계의 옵션 탭에 라디오 버튼 세트가 있습니다.
BTW, exe_ctx 인수에서 얻은 프로세스 (이 버전에서 생략 한)가 작동하지 않는 것처럼 들리지만 다른 문제와 혼동 될 수 있습니다. 계속하기 전에 SetAsync (True)하면 계속해서 exe_ctx.process잘 작동합니다.
마지막으로 Python 명령이 프로세스 상태를 중지됨에서 실행 중으로 전환하는 경우 다음을 호출하여 lldb에 알려야합니다.
result.SetStatus(lldb.eReturnStatusSuccessContinuingResult)
또는
result.SetStatus(lldb.eReturnStatusSuccessContinuingNoResult)
이는 명령이 중단 점 콜백 또는 중지 후크에서 사용되는 경우 중요합니다. 여기서 lldb는 결과를 사용하여 중단 점 명령 또는 중지 후크가 대상을 강제로 다시 시작했는지 여부를 추적합니다.