문제

이것은 더 이론적인 질문에 대해 매크로(나는 생각한다).난 매크로 소스 코드를 생성 개체 코드없이 그것을 평가하여,프로그래머를 만들 더 다양한 문법 구조물입니다.If I had to 분류하고 이러한 두 가지 매크로 시스템,나는 말이 있었다"C"스타일로는"Lisp 스타일"매크로입니다.

그것은 보인다는 디버깅 매크로 까다로울 수 있기 때문에 런타임 시에는 코드는 실제로 실행에서 다릅니다.

어떻게 디버거를 추적의 프로그램의 실행의 측면에서 전처리된 소스 코드?있는 특별한"디버깅 모드"로 설정해야 하는 캡처하는 추가에 대한 데이터를 매크로?

C 에서는 내가 이해할 수 있는 설정 컴파일 타임 스위치 디버깅,하지만 어떻게 해석되고,언어와 같은 일부 형태의 패키지,그것을 할 수 있나요?

에 대해 사과하지 않고 이웃하지만,lisp 툴체인 것보다 더 많은 시간을 필요를 보내려 있습니다.

도움이 되었습니까?

해결책

지가 있다고 생각하지 않는 근본적 차이에서"C style"및"Lisp 스타일"매크로에서 그들이 어떻게 컴파일합니다.모두 변환하기 전에 소스를 컴파일러의 적절한 그것을 보고합니다.큰 차이점은 C 의 매크로를 사용할 C 선처리기(약한 보조하는 언어는 대부분에 대한 간단한 문자열체)하는 동안,Lisp 의 매크로 기록되 패키지 자체(따라서 아무것도 할 수있는 모든).

(옆으로:나는 보지 못했 아닌 컴파일 패키지에는...확실히 이후 세기의 전환기.그러나 어떤 경우,해석되는 것을 매크로 디버깅 문제를 쉽게,열심히 때문에,당신은 더 많은 정보를니다.)

동의함으로 마이클:나는 보지 못했 디버거를 위한 C 처리하는 매크로에서 모두.코드를 사용하는 매크로를 얻을 변환하기 전에 아무것도 발생합니다.이 "디버깅 모드"위한 C 컴파일하는 코드 일반적으로 의미점 기능,형식,변수,이름,그리고 그런 -나는 생각하지 않는다 그들에 대한 정보를 저장됩니다.

  • 디버깅을 위한 프로그램 사 매크로,Lisp 은 거의 동일 C 기:의 디버거 보고 컴파일 된 코드가 아닌,매크로 응용 프로그램.일반적으로 매크로 유지 간단한 디버깅 독립적으로 사용하기 전에 방지하기 위해, 에 대한 필요 이처럼 C.

  • 디버깅을 위한 매크로 자신, 기 전에,당신이 가고 어딘가에 그것을 사용,Lisp 가능 는 이보다 쉽 C 예를 들어,복제고 macroexpand-1 (하지만에서는 C 가 분명하는 방법 macroexpand 전체 파일을 완전,에 면).당신이 볼 수 있습니다 전과 후의 macroexpansion, 오른쪽에서 당신의 편집기를 작성할 때 니다.

내가 기억하지 못하는 것은 어떤 시간에 실행 상황에 걸쳐 디버깅 매크로 정체되었을 것이 유용합니다.하나의 버그에서 매크로 정의하는 경우 macroexpand-1 분리 문제를 즉시 또는 그것의 버그가 아래의 경우에는 일반 디버깅 기능이 잘 작동하고 돌아오지 않는 macroexpansion 사이에 발생한 두 개의 프레임의 내 호출 스택입니다.

다른 팁

in "nofollow noreferrrer"> Lispworks 개발자는 스테퍼 도구 .

LispWorks는 스테퍼를 제공합니다. 여기서 전체 매크로 확장 프로세스 .

라켓 가 매크로가있는 코드 디버깅을위한 종류의 지원을 살펴보아야합니다. 이 지원은 Ken이 언급함에 따라 두 가지 측면이 있습니다. 한편으로는 매크로 디버깅 문제가 있습니다. 일반적인 LISP에서는 수행하는 가장 좋은 방법은 매크로 양식을 수동으로 확장하는 것입니다. CPP를 사용하면 상황이 유사하지만 원시적이지만 CPP 확장만으로 코드를 실행하고 결과를 검사합니다. 그러나이 두 가지 모두는 더 많은 매크로를 더 포함하기에 충분하지 않으며 "NoFollow noreferrer"> 매크로를 갖는 동기였습니다. Debugger in Racket - 바운드 식별자 등의 것들에 대한 추가 GUI 기반 표시가있는 구문 확장 단계를 하나씩 보여줍니다.

매크로를 사용하여 측면에서 라켓은 항상 다른 계획과 Lisp 구현보다 더 진보되었습니다. 아이디어는 각 표현식 (구문 객체로서)이 코드와 소스 위치가 포함 된 추가 데이터와 코드를 더한 것입니다. 이렇게하면 양식이 매크로 인 경우 매크로에서 나오는 부분이있는 확장 된 코드는 해당 사용이 아닌 매크로의 정의에서 올바른 소스 위치를 가질 것입니다 (양식이 실제로 존재하지 않는 경우). 일부 체계와 LISP 구현은 Dmitry-VK가 언급 한 Dmitry-VK로서 하위 폼의 ID를 사용 하여이 제한을 구현합니다.

Lisp Macros (내가 의심되는 C 매크로와는 상당히 다르거나 디버깅)에 대해 모르지만, 아마도 C / C ++ 디버깅은 C / C / C ++ 디버거가 C 전처리 자 매크로의 소스 수준 디버깅을 특히 잘 처리하지 못합니다.

일반적으로 C / C ++ 디버거는 매크로 정의로 '단계'하지 않습니다.매크로가 여러 문장으로 확장되면 디버거는 일반적으로 각 디버거의 '단계'작업에 대해 매크로가 호출되는 동일한 소스 라인 (매크로가 호출되는)을 유지합니다.

이것은 매크로를 디버깅 할 수 있으며 그렇지 않으면 다른 것보다 더 고통 스러울 수 있습니다 - C / C ++에서 피해야 할 또 다른 이유.매크로가 진정으로 신비한 방식으로 오작동하는 경우 어셈블리 모드로 가려면 디버깅하거나 매크로를 확장하거나 (수동으로 컴파일러의 스위치를 사용하십시오).그것은 당신이 그 극단에 가야만하는 것은 꽤 드뭅니다.복잡한 매크로를 쓰는 경우, 아마도 잘못된 접근 방식을 취할 것입니다.

일반적으로 C 소스 레벨 디버깅은 선 세분성 ( "다음"명령) 또는 명령 레벨 세분성 ( "단계")입니다. 매크로 프로세서는 컴파일러가 컴파일러를 소스 코드 행에 컴파일 된 시퀀스를 매핑 할 수 있도록 처리 된 소스에 특수 지시문을 삽입합니다.

Lisp에서는 매크로와 컴파일러가 소스 코드를 추적하여 컴파일 된 코드 매핑을 추적하지 않으므로 소스 코드에서 단일 스테핑을 수행 할 수있는 것은 아닙니다.

명백한 옵션은 Macroexpanded 코드에서 단일 스테핑을 수행하는 것입니다. 컴파일러는 이미 최종, 확장, 코드 버전을보고 컴퓨터 코드 매핑을위한 소스 코드를 추적 할 수 있습니다.

다른 옵션은 조작 중에 Lisp 표현식이 ID를 갖는 사실을 사용하는 것입니다. 매크로가 간단하고 코드를 템플리트로 파괴하고 붙여 넣는 경우 확장 된 코드의 일부 표현식은 소스 코드에서 읽은 표현식으로 (EQ 비교와 관련하여) 동일합니다. 이 경우 컴파일러는 일부 표현식을 확장 된 코드에서 소스 코드로 매핑 할 수 있습니다.

간단한 대답은 복잡하다는 것입니다 .-) 프로그램을 디버그 할 수 있고 매크로를 추적하는 데 더 많은 다른 것들이 있습니다.

C 및 C ++에서 전 처리기는 매크로를 확장하고 실제 소스 코드에 포함하는 데 사용됩니다. 원래 파일 이름과 줄 번호는 #line 지시문을 사용하여 확장 된 소스 파일에서 추적됩니다.

http://msdn.microsoft.com/ en-us / library / b5w2czay (vs.80) .aspx

C 또는 C ++ 프로그램이 디버깅을 사용하여 컴파일되면 어셈블러는 소스 선, 심볼 이름, 유형 설명자 등을 추적하는 객체 파일에 추가 정보를 생성합니다.

http://sources.redhat.com/gdb/onlinedocs/stabs.html.

운영 체제에는 디버거가 프로세스에 연결하여 프로세스 실행을 제어 할 수있는 기능이 있습니다. 일시 중지, 단일 스테핑 등.

디버거가 프로그램에 첨부되면 디버깅 정보의 프로그램 주소의 의미를 조회하여 프로세스 스택 및 프로그램 카운터를 심볼릭 폼으로 다시 변환합니다.

동적 언어는 일반적으로 인터프리터 또는 바이트 코드 VM인지 여부 가상 컴퓨터에서 실행됩니다. 디버거가 프로그램 흐름을 제어하고 프로그램 상태를 검사 할 수 있도록 후크를 제공하는 VM입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top