2012-01-18 2 views
4

GDB에 구조체가 있고이 구조체를 검사하는 스크립트를 실행하고 싶습니다. 파이썬 GDB에서 쉽게 지금키나 파이썬 GDB의 값에 접근하는 방법 값

(gdb) python mystruct = gdb.parse_and_eval("mystruct") 

를 통해 구조체에 액세스 할 수 있습니다 나는 GDB.Value 개체입니다 MYSTRUCT이라는 변수를 얻었다. 그리고이 객체를 사전 (예 : mystruct['member'])으로 사용하여 구조체의 모든 멤버에 액세스 할 수 있습니다.

문제는 내 스크립트가 특정 구조체에 어떤 멤버가 있는지 알 수 없다는 것입니다. 그래서이 GDB.Value 객체에서 키 (또는 값)를 얻고 싶었습니다. 그러나 mystruct.values()도 아니고 mystruct.keys()도 여기에서 일하고 있지 않습니다.

이 정보에 액세스 할 수있는 방법이 있습니까? 나는이 정보에 접근 할 수 없다고 생각하지만, 어디서나 발견하지는 못했습니다. dir(mystruct)은 키나 값 기능이 없다는 것을 나에게 보여 줬다. mystruct를 인쇄하여 모든 멤버를 볼 수는 있지만 멤버를 파이썬으로 가져 오는 방법이 아닙니까?

답변

4

GDB documentation에서 :

tp = mystruct.type 

tp.fields()

를 통해 fields 반복 :

당신과 같이 mystruct의 유형을 얻을 수 있습니다 여기에 예를 들어 세션 성적표는 악의적 인 대안이 필요합니다 .-)

업데이트 : GDB 7.4가 방금 출시되었습니다. announcement에서 : 구조체와 노동 조합 유형

Type 객체 이제 표준 파이썬 사전 (매핑) 방법을 사용하여 필드 에 액세스 할 수 있습니다.

+0

업데이트 해 주셔서 감사합니다 !! :) – Uhlo

1

악 해결 방법 :

python print eval("dict(" + str(mystruct)[1:-2] + ")") 

이 일반화 경우 나도 몰라. 데모, 나는 지금은 평소와 같이 g++ -g test.cpp -o test을 실행하고 gdb test을 불 최소한의 예를 test.cpp

#include <iostream> 

struct mystruct 
{ 
    int i; 
    double x; 
} mystruct_1; 

int main() 
{ 
    mystruct_1.i = 2; 
    mystruct_1.x = 1.242; 
    std::cout << "Blarz"; 
    std::cout << std::endl; 
} 

을 썼다.

(gdb) break main 
Breakpoint 1 at 0x400898: file test.cpp, line 11. 
(gdb) run 
Starting program: ... 

Breakpoint 1, main() at test.cpp:11 
11  mystruct_1.i = 2; 
(gdb) step 
12  mystruct_1.x = 1.242; 
(gdb) step 
13  std::cout << "Blarz"; 
(gdb) python mystruct = gdb.parse_and_eval("mystruct_1") 
(gdb) python print mystruct 
{i = 2, x = 1.242} 
(gdb) python print eval("dict(" + str(mystruct)[1:-2] + ")") 
{'i': 2, 'x': 1.24} 
(gdb) python print eval("dict(" + str(mystruct)[1:-2] + ")").keys() 
['i', 'x'] 
+0

이 해결 방법을 제공해 주셔서 감사합니다! 안타깝게도 내부에 문자열이나 다른 구조체가있는 구조체에서는 작동하지 않습니다. 그래서이 솔루션은 항상 작동하지 않습니다! – Uhlo