2012-10-13 3 views
2

나는 소프트웨어 릴리스 사이에서 변경하는 경향이있는 (C) 구조체에 대한 GDB 파이썬 인터페이스를 사용하여 꽤 - 프린터를 작성했습니다. 형식이 변하기 때문에 필자는 적응할 수있을만큼 동적 인 프린터를 만들려고 노력했으며 파이썬 예외를 던지기보다는 유용한 것을 항상 인쇄하려고했습니다.파이썬으로 작성된 GDB 예쁘 프린터를 어떻게 테스트 할 수 있습니까?

는 지금 내가 지원하는 데 필요한 두 가지 형식이 있지만 미래에 몇 가지 더있을 가능성이있다. 프린터를 테스트하기 위해 여러 릴리즈의 코어 덤프를 수동으로로드하지 않아도되도록 프린터의 단위 테스트를 작성하고 싶습니다.

디버깅 세션 내에서 gdb.Value를 직렬화하고 단위 테스트에로드 할 수 있다고 생각했지만 (피클이 gdb.Value와 작동하지 않음) 수행 할 수 없었습니다. 코어 덤프는 매우 커서 테스트를 위해 예쁜 프린터와 스크립트 GDB를 저장하는 것은 옵션이 아닙니다.

어떻게 거대한 주위 코어 덤프를 유지하지 않고 내 꽤 프린터를 단위 테스트 할 수 있습니다?

답변

2

어떻게 거대한 주위 코어 덤프를 유지하지 않고 내 꽤 프린터를 단위 테스트 할 수 있습니다?

작은 코어의 당신은 당신이 꽤 프린터가 struct Foo을 가정 해 봅시다 :-)

덤프 유지하고, 그 자료 사이에 변화 유지합니다.

는 다음과 같은 프로그램을 컴파일 :

#include <stdlib.h> 
#include "foo.h" 
int main() 
{ 
    struct Foo f; 
    // initialize f with some values 
    abort(); 
} 

컴파일을하고 프로그램을 실행, IT 및 foo-v2foo-v2.core 같은 결과 코어 (당신이 struct Foo의 버전 2에 지금 가정)을 저장합니다. 코어는 아주 작아야합니다.

은 이제 버전 관리 시스템에서 struct Foo의 버전 1에 해당하는 체크 아웃 foo.h은 (당신이 바로,는 버전 관리 시스템을 사용 할 ?). 재 구축 및 foo-v1foo-v1.core로 저장, 프로그램을 다시 실행합니다.

이제 릴리스마다 프로그램을 다시 빌드/재실행하고 GDB pretty 프린터의 출력을 예상 결과와 비교해야합니다. 그래도 계속 작동하면 완료됩니다. 그렇지 않다면 struct Foo이 변경되어 있어야하며 예쁜 프린터를 업데이트해야합니다.

저장 foo-v3foo-v3.core 같은 새로운 바이너리 및 핵심은, 모든 foo-vNfoo-vN.core쌍에 대해 테스트, 예쁜 프린터를 업데이트 (테스트 자체에 대한, GDB 소스와 함께 제공 GDB의 유닛 테스트 프레임 워크를 사용).

+0

내가 고려하고 좋습니다. 가급적 나는 파이썬 외부의 종속성을 피하는 것이 좋습니다. –

+0

@DavidHolm 어떤 종속성을 제거 하시겠습니까? 나는 foo-vN과 foo-VN.core를 저장할 필요가 없다는 것을 믿을 수는 없다.하지만 어쨌든 필요에 따라 다시 생성 할 수는있다. 예쁜 프린터의 출력을 "황금"출력과 비교할 수 있다면 GDB 테스트 프레임 워크에 대한 종속성을 제거하는 것이 쉽습니다. –

+0

GDB에 대한 의존성. 현재 GDB 7은 공식적으로 지원되는 제품이 아니므로 GDB를 사용하고 있습니다. 어떤 사람들은 내 빌드를 사용하고 있고, 어떤 사람들은 그들 만의 빌드를 가지고 있기 때문에, 테스트 코드가 GDB의 어떤 버전과도 독립적이라면 선호 할 것입니다. –

관련 문제