2015-10-29 50 views
2

我正在嘗試穿過一個線程。這個工程雖然我使用debugger.SetAsync(False),但我想這樣做異步。這裏是一個腳本來重現它。它在設置debugger.SetAsync (False)而不是True時步驟。我加了time.sleep,以便有時間執行我的指示。我希望下一個指令在frame.pcLLDB Python/C++綁定:異步步驟說明

import time 
import sys 
lldb_path = "/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python" 
sys.path = sys.path + [lldb_path] 

import lldb 
import os 
exe = "./a.out"  
debugger = lldb.SBDebugger.Create() 

debugger.SetAsync (True) # change this to False, to make it work 


target = debugger.CreateTargetWithFileAndArch (exe, lldb.LLDB_ARCH_DEFAULT) 

if target: 
    main_bp = target.BreakpointCreateByName ("main", target.GetExecutable().GetFilename()) 
    print main_bp 

    launch_info = lldb.SBLaunchInfo(None) 
    launch_info.SetExecutableFile (lldb.SBFileSpec(exe), True) 
    error = lldb.SBError() 
    process = target.Launch (launch_info, error) 
    time.sleep(1) 
    # Make sure the launch went ok 
    if process: 
     # Print some simple process info 
     state = process.GetState() 
     print 'process state' 
     print state 
     thread = process.GetThreadAtIndex(0) 
     frame = thread.GetFrameAtIndex(0) 
     print 'stop loc' 
     print hex(frame.pc) 
     print 'thread stop reason' 
     print thread.stop_reason 

     print 'stepping' 
     thread.StepInstruction(False) 

     time.sleep(1) 

     print 'process state' 
     print process.GetState() 

     print 'thread stop reason' 
     print thread.stop_reason 
     frame = thread.GetFrameAtIndex(0) 
     print 'stop loc' 
     print hex(frame.pc) # invalid output? 

版本:LLDB-340.4.110(在Xcode提供)
的Python:Python的2.7.10
操作系統:Mac約塞米蒂

回答

2

的「異步「lldb API的版本使用基於事件的系統。你不能等待事情發生使用睡眠 - 而是使用WaitForEvent API的lldb提供。如何做到這一點的一個例子,在給出:

http://llvm.org/svn/llvm-project/lldb/trunk/examples/python/process_events.py

有在顯示瞭如何加載LLDB模塊並執行參數解析例子的開始了一堆東西。你想看的部分是循環:

 listener = debugger.GetListener() 
     # sign up for process state change events 
     stop_idx = 0 
     done = False 
     while not done: 
      event = lldb.SBEvent() 
      if listener.WaitForEvent (options.event_timeout, event): 

及以下。

+0

我的調試器交互在一個不能阻塞的線程上運行。所以當我調用'thread.StepInstruction(False)'時,我不在乎下一個狀態,我只想觸發事件,然後再看看這個過程並檢測它的狀態。所以在我再次看看這個過程之前,我必須爲每一個我觸發的事件設置「WaitForEvent」。 –

+0

是的,沒錯。這樣事件隊列和進程狀態保持同步。 –

+1

將一個漂亮的等待循環轉換爲輪詢似乎很難,但無論如何,要輪詢你想要的GetNextEvent,如果有的話會得到一個事件,如果沒有則返回一個空的事件。 –