2016-10-14 5 views
0

파이썬 gdb.execute ('...')로 등가 I는 (C에서)과 같은 구조를 가질 경우는 <code>a.x=1</code> 및 <code>a.y={2,3}</code>와 <code>a</code> lldb

typedef struct { 
    int x; 
    int[2] y; 
} A; 

그것의 인스턴스를 말한다.

파이썬 스크립팅에서 a.y[1]에 액세스하려면 실제로이 매우 유연한 명령을 수행해야합니까?

script print lldb.frame.FindVariable('a').GetChildMemberWithName('y').GetChildAtIndex(1) 

나는 C에서 구조체 변수의 멤버를 인쇄 할 때 나에게 도움이 함수를 작성했습니다 : 다음

command script import lldb_cmds.py 

및 전화로로드 할 수 있습니다

# lldb_cmds.py 

import lldb 

def get_nested_val_c(vnames,idx=None): 
    """ 
     vnames is a list of strings ['a','b','c',...] that will be evaluated as if 
     you called 

      a.b.c.,... 

     So for [a,b,c] you get: 

      a.b.c 

     If idx is given, it is evaluated as 

      a.b.c[idx] 

    """ 

    try: 
     x=lldb.frame.FindVariable(vnames[0]) 
     for v_ in vnames[1:]: 
      x=x.GetChildMemberWithName(v_) 
    except TypeError: 
     x=lldb.frame.FindVariable(vnames) 

    if idx == None: 
     return x 

    try: 
     x=x.GetChildAtIndex(idx[0]) 
     for i_ in idx[1:]: 
      x=x.GetChildAtIndex(i_,False,True) 
    except TypeError: 
     x=x.GetChildAtIndex(idx) 

(위와 같은) with

python lldb_cmds.get_nested_val_c[['a','y'],1) 

그러나 짧은 길이 있습니까? 그래, 난 당신이

p a.y[1] 

을 쓸 수 있지만 동안은 lldb에 루프가있을 것 같지 않기 때문에, 어떻게 그런 긴 문장에 의지하지 않고 변수 색인이를 인쇄 할 수 알아?

(그리고 그래 난 당신이 예를 들어 쓸 수 있습니다 알고 p *(int(*)[2])a.y하지만 일반적으로 요구하고 있습니다.)

답변

1

난 당신이 여기에 수행 할 작업을 완전히 확실하지 않다. 몇 가지 잠재적 인 질문에 답해 드리겠습니다. 그 중 하나가 올바른지 말해 줄 수 있습니다 ...

알려진 중첩 구조에 도달하는 데 더 좋은 방법을 찾으려면이 방법이 더 편리 할 수 ​​있습니다 : 단지 명령을 실행하고 결과를 출력

lldb.debugger.HandleCommand("command") 

:

var = lldb.frame.FindVariable("a").GetValueForExpressionPath("y[0]") 

무엇을 당신이하려고하는 것은 실행되면 명령 줄이 작업을 수행하는 두 가지 방법이 있습니다, 파이썬 스크립트 명령 lldb의 stdout 또는 :

ret_val = lldb.SBCommandReturnObject() 
lldb.debugger.GetCommandInterpreter().HandleCommand("command", ret_val) 

이 명령을 실행하고 ret_val 개체에 명령의 결과 (lldb 드라이버에서 명령이 실행될 때 인쇄되는 결과)를 반환합니다. 이것은 명령의 결과를 검사하고자 할 때 편리합니다. 또한 ReturnObject는 명령이 성공했는지 여부를 알려주고 그렇지 않은 경우 오류를 보유합니다. - 당신의 예에서와 같이 - 당신이 정적으로 할당 된 배열을 인쇄하려는 경우

당신은 할 수 있어야, 위에서 보여 캐스트를 할 필요가 없습니다 :

(lldb) P 바깥에

그리고 모든 요소가 인쇄되어야합니다. 동적 인 크기의 배열 (예 : malloc'ed 배열에서 가리키는 int *)을 다루는 경우 Xcode 8.0의 lldb에는 parray이라는 새로운 명령이 있습니다.

(lldb) parray 10 a.y

y가 가리키는 int 배열의 10 요소를 인쇄합니다.