2012-03-08 2 views
7

다음 질문에 의아해했습니다. "정적"레이블의 장점을 유지하면서도 사이트에서 프로덕션 코드를 디버깅하는 방법은 무엇입니까?정적과 비 정적 함수 - 디버깅 임베디드 시스템 컨텍스트

의도하지 않은 동작이 고객 사이트에서 발생하고 한 번도 발생하지 않습니다. 대부분의 경우 디버그를 수행하는 옵션을 사용하면 많은 노력을 절약하고 매우 빠른 응답을 제공 할 수 있습니다. 이러한 디버그는 일반적으로 "정적"정의로 우리를 데려 함수의 동작을 확인 포함됩니다.

정적 함수는 중단 점 넣기 또는 실행과 같은 디버그 셸에서 디버깅 할 수 없습니다. 반면에 모든 함수를 public으로 정의하면 코드 구조와 최적화 슬픔이 발생합니다.

적어도 두 가지 다른 빌드를 컴파일하는 것과 같은 옵션이 있음을 알고 있습니다. 하나는 정적 및 하나는없는 빌드이지만, 이것은 자동화 테스트에 적합하고 결국에는 최종 생산 빌드가 적합하지 않습니다.

당신의 측면에서 약간의 통찰력을 얻었습니다. 주로이 딜레마를 어떻게 해결했는지에 대한 평가가있었습니다. 또는 그 질문에 대한 답을 ""더 중요합니다. "

C here의"정적 "에 대한 좋은 토론입니다.

+1

'static'으로 선언 된 함수에 중단 점을 설정할 수 없다는 것을 의미합니까? C에서 static 함수는 정상적인 함수이지만 다른 "번역 단위"에서는 호출 할 수 없습니다. 최적화되지 않은 경우 원격 디버깅이나 로컬 디버깅을 막지 않아야합니다. –

+1

정적 함수에 전역 포인터를 정의하고 그 값을 사용하여 정적 함수에 중단 점을 설정할 수 있습니다. 컴파일러가이를 사용하지 않는 것으로 제거하지 못하도록이 포인터를 '휘발성'으로 만들 수도 있습니다. –

+0

@JoachimPileborg 정적 함수는 (컴파일러를 사용하여 플래그가 지정된 경우에도) 심볼 테이블에 들어 가지 않으므로 디버깅이 불가능합니다 (중단 점과 같은). – EdwardH

답변

1

일부 디버거는 "정적"기능을 디버깅 할 수 있습니다. 때때로 정적 함수는 호출 사이트에서 줄을 따라 확장되지만 디버거의 작업을 어렵게 만들고 일부 디버거는 그냥 포기합니다.

(실제로 호출 사이트의 인라인 확장은 실제로 "정적"에만 해당하는 속성이 아닙니다. 함수에 대해 "더 많이"알고 있기 때문에 컴파일러가이를 더 잘 수행 할 수 있습니다. 특히 이름이 표시되지 않습니다. 현재 번역 단위 외부의 모든 전화가 줄을 팽창하는 경우 함수의 코드가 완전히 생략 할 수 있도록)

매크로 사용하여 한 번 일반적인이었다. 매크로를 설정 한 후

#ifndef STATIC 
# define STATIC static 
#endif 
... 
STATIC void somefunc() { ... } 

및 디버그 빌드를 "무"로 만듭니다. 잘 작동하지만 인라인으로 확장 된 경우에도 정적 함수를 처리 할 수있을 정도로 똑똑한 디버거를 찾는 것이 좋습니다.

+0

매크로는 사내 테스트 기간 동안 문제를 해결하지만 문제가 고객 사이트에서 발생했을 때 적합하지 않습니다. 디버그 버전을 설치하면 문제가 해결됩니다. – EdwardH

1

정적 함수를 호출하는 공개적으로 액세스 할 수있는 함수에 중단 점을 넣을 수 있습니까? 그런 다음 인수를 확인하고 최소한 반환 값을 확인할 수 있습니다. 문제가 고객 사이트에서만 발생하고 단위 테스트/통합 테스트에서 해당 함수가 수신 할 것으로 예상되는 입력에 문제가 나타나지 않으면 문제는 아마도 이러한 함수가 입력을 얻고 있거나 입력 시퀀스가 ​​문제가되는 것일 수 있습니다. 함수는 당신이 예상하지 못했던 실질적인 문제가 여러분이보고있는 정적 함수 밖일 수 있다는 것을 의미하는 것입니다.

이미 어떤 정적 함수에 문제가 있는지를 알고 있고 문제의 원인이 무엇인지 알 수 있다면 릴리스 빌드에 버그를 확인하기위한 간단한 단위 테스트 함수를 넣을 수 있습니다. 용의자. 물론,이 기능이 직접 제어하는 ​​경우 (예 : 6 톤 크레인) 두 가지 버전의 기능을 작성해야하고 크레인을 제어하기위한 모형이 있어야하며 이에 대한 테스트를 실행해야합니다.

최소한 릴리스와 디버그 빌드 간의 컴파일러 불일치를 배제 할 수는 없습니다. 우리 모두는 컴파일러가 완벽하다는 생각을하고 싶습니다.그리고 고객에게 디버그 빌드를 제공하면 문제가 해결되는 경우가 있습니다 ...

+0

모듈 API를 디버깅하는 것이 항상 충분하지 않습니다. 특히 개인 기능에서 이미 문제가 의심되는 경우 특히 그렇습니다. 필자는 필요한 테스트를 수행하는 데있어 귀하의 요점에 동의하지만 임베디드 환경에는 항상 적용되는 것은 아닙니다. 우리는 단위 테스트가 다루지 않을 수있는 이벤트의 순서 및 비동기 처리에 대해 여러 번 이야기합니다. – EdwardH

3

근본적인 질문은 ""이 아닌 것으로 간주합니까? "입니다. "정확히 무엇을 배송합니까??" 임베디드 코드의 경우 디버그 빌드에서 테스트의 대부분을 수행하고 다른 옵션으로 컴파일 된 릴리스 버전을 출시하는 경우 테스트되지 않은 코드가 고객에게 배송됩니다. 하드웨어에 가깝게 실행하면 (최적화 프로그램이 쉽게 도입 할 수있는) 타이밍이나 메모리 액세스 패턴의 작은 변화로 인해 시스템의 동작이 크게 변경 될 수 있습니다.

내 현재 전략은 디버깅 할 때 사용할 수있는만큼 최적화 된 디버그 버전을 제공하는 것입니다. 정적 함수가 없으므로 디버거에서 최대한 많은 상태를 볼 수 있습니다.

예, 가능한 컴파일러 생성 효율성을 제공하지만 디버그 버전이 요구 사항을 충족 할만큼 빠르면 문제가되지 않습니다. 그리고 내가 제공하는 코드는 옵티마이 저가 생성 된 놀랍지 않은 전체 릴리즈 사이클에서 테스트 한 코드와 완전히 동일합니다.

+0

"정적"사용은 효율성과 관련이있을뿐만 아니라 여러 가지면에서 객체 지향 개념 (예 : 적절한 구분을 구현 및 구현하므로 다른 코더는 정의 된 API를 무시하지 않음)을 언급 할 가치가 있습니다. 제기 된 새로운 질문은 여기에서 별도의 주제가 될 가치가 있습니다. 고려해야 할 장단점이 몇 가지 있습니다. – EdwardH

+0

캡슐화와 가시성에 관해서는 해당 헤더에서 기능을 그대로 두는 것이 정적이라고 선언하는 것만 큼 좋습니다. 명명이 도움이 될 수도 있습니다."왜 Module2.DoSomething_private()를 Module2.c에서 호출합니까?" 리뷰에서 물어볼 좋은 질문입니다 ... – AShelly

+1

또한보십시오 http://stackoverflow.com/q/420343/10396 – AShelly

관련 문제