2013-03-01 1 views
12

Java에서 코드를 작성할 때 Eclipse에 포함 된 디버거를 사용합니다. 이 컨텍스트에서 객체를 시각화 할 때 디버거는 자동으로 toString() 함수를 호출합니다.이 기능은 프로그램 상태를 탐색하면서 빠른 시각화에 매우 편리합니다.C 구조체에 대한 gdb 인쇄 기능 정의

이제 C에서 작업 할 때 디버깅을 위해 emacs + gdb를 사용하지만 복잡한 C 구조를 시각화하는 데 필요한 기능을 찾고 다시 만들지 않았습니다. 즉 특정 인쇄 기능을 호출했습니다. 물론 일반적인 toString() 메서드는 없지만 어쨌든 필자는 내 구조의 인쇄 기능을 어딘가에 구현했습니다.

그러나 나는 gdb에서 어떤 것을 시각화하기를 원할 때, 수동으로 gdb에서 p my_print_function(my_struct_pointer)을 수행하는 인쇄 기능을 호출해야한다. (이름을 기억하고 정확하게 입력해야하며, 또 다른 표준 출력이있을 수도있다. 창문 ...).

내가 원하는 것은 ", 구조체의 포인터 타입 T에 gdb를 인쇄 함수를 호출 할 때 해당 사용자 정의 인쇄 기능 F ... 자동으로 호출"말을 GDB를 구성하는 것입니다. 이것을 할 수있는 방법이 있습니까? 미리 감사드립니다.

답변

5

좋은 질문입니다.

예, 그런 것 같습니다. GDB 7은 "pretty-printers" written in Python을 지원합니다. 실제 목표 언어로 이미 작성된 코드를 사용하는 것만 큼 편리하지는 않지만 (제 생각에는) 충분히 훌륭 할 것입니다.

These are the commands 예쁘 프린터로 작업하십시오. 당신이 한 줄에 하나의 멤버 들여 쓰기 형식으로 구조를 인쇄 gdb를 원하는 경우 주어진 구조체

사용 print *struct_ptr의 멤버를 인쇄 할 수

+0

참 편리하지는 않지만 ... 아마도 가장 좋은 기존 솔루션입니다. 감사. – Hobbes

7

사용 print struct_var는, 주어진 구조체 포인터의 구성원

사용 set print pretty on를 인쇄하려면 같은 :

$1 = { 
     next = 0x0, 
     flags = { 
      sweet = 1, 
      sour = 1 
     }, 
     meat = 0x54 "Pork" 
     } 

또한 당신이 ptype struct_var을 사용할 수를 주어진 구조체의 정의를 인쇄하는

나는 모든 GDB/파이썬 꽤 인쇄 이론을 배울 수있는 시간이 없었 있지만

대한 추가 정보는 here

1

, 나는 GDB 내 C 프린터를 재사용 할 수있는 간단한 방법을 발견했다. 구조체 "struct_name_1"및 C 기능 "struct_printer_1_c_func"을 "struct_name_2"와 "struct_printer_2_c_func"를 연결하는

예 :

1) 파일 struct_printers.py

2

class Pstruct (gdb.Function): 
    """Returns a string describing a struct... 
    """ 

    def __init__ (self): 
    super (Pstruct, self).__init__ ("pstruct") 

    def invoke (self, name): 
     expr_type = name.dereference().type.tag 
     expr_string = name.__str__()    
     expr_address = expr_string.split(" ")[0]  
     if (cmp(expr_type, "struct_name_1") == 0): 
     return gdb.parse_and_eval("struct_printer_1_c_func("+ expr_address +")") 
     elif (cmp(expr_type, "struct_name_2") == 0): 
     return gdb.parse_and_eval("struct_printer_2_c_func("+ expr_address +")") 
     else: 
     print "[No struct printer for this type]" 
     return gdb.parse_and_eval(expr_address) 

Pstruct() 
만들기) 추가 이 당신의 .gdbinit에 : 당신은 당신이 검사 할 구조체에 대한 포인터의 앞에 GDB에있을 때
source struct_printers.py 

define pstruct 
p $pstruct($arg0) 
end 

그런 다음, 대신 인쇄 pstruct를 호출합니다.

아마도 추악하고 확장 성이 떨어지지 만 필자가 필요로하는만큼 충분히 잘 작동합니다 (그러나 나는 누군가 내가 파이썬 예쁜 인쇄물로이 작업을 수행하는 올바른 방법을 알고 있음을 기쁘게 생각합니다).