2012-12-07 4 views
4

나는 더 나은 기술을 찾고 있습니다. 나의 일반적인 투쟁은 디버거가 너무 늦게 또는 너무 일찍 들어가서 변수의 값을 잡을 수 있다는 사실이다. . 내가 먼저 시도 무엇SLIME 디버거에서 로컬 변수의 값을 확인 하시겠습니까?

: 디버거가 휴식 시간에 입력하면

(loop for i from 0 to 10 do 
    (break)) 

, 내가 i에 액세스 할 수 없습니다 :(그래서 내가 디버거의 e 옵션 (프레임의 평가)를 시도했습니다 낭비 노력입니다, . 변수가 단지 "가 아닌"있기 때문에 점액 일반적으로 단지 버그 알아, 내가 도움이되지 않는 허풍 v 또는 t에 다시 연결해야

내가하고 결국 무엇을 :.

(loop for i from 0 to 10 do 
    (signal i)) 

이것은 바보 같지만 작동합니다. 디버거에서 검사 할 수있는 프레임 스택에 i을 넣었 기 때문입니다. 그러나 이것은 단지 ... 글쎄, 그것은 단어의 최악의 의미에서 hackish입니다. 변수를 "보거나"더 의미있는 방법으로 중단 점을 넣을 수있는 방법이 없으므로 중단 점을 입력 할 때 주변 변수가 더 많이 표시 될 수 있습니까?

+0

'(중단)'대신'(디버그)'를 쓰고 싶습니까? – Dmitry

+0

오, 알았어요. 죄송합니다. CL 상호 작용을 도와 드릴 수 없습니다. – Dmitry

답변

2

첫 번째 조각은 CCL (기본 optimize 설정), 이맥스 (24), 그리고 최근에 뽑아 점액과 나를 위해 잘 작동합니다 :

Break 
    [Condition of type SIMPLE-CONDITION] 

Restarts: 
0: [CONTINUE] Return from BREAK. 
1: [RETRY] Retry SLIME REPL evaluation request. 
2: [*ABORT] Return to SLIME's top level. 
3: [ABORT-BREAK] Reset this thread 
4: [ABORT] Kill this thread 

Backtrace: 
    0: (#<Anonymous Function #x186F9B7E>) 
     Locals: 
     I = 0 
    1: (CCL::CHEAP-EVAL (LOOP FOR I FROM 0 TO 10 DO (BREAK))) 

⋮ 

sldb-eval-in-frame도 나를 위해 잘 작동합니다. 어쩌면 다른 Lisp 구현이나 Slime의 다른 버전을 사용해보아야 할 것입니다.

또한 여기에서는 다른 optimize 설정이 중요 할 수 있으며 일부 구현은 인터프리터 코드 (인터프리터를 사용할 수있는 경우)에 대해 더 나은 디버깅 결과를 제공합니다. (declaim (optimize (debug 3) (speed 0) (space 0)))과 같은 것을 시도해보십시오.

+0

당신을 진심으로 환영합니다. – danlei

+1

@wvxvw'declaim'에 대해서 - IIRC는 현재 파일에만 영향을 미칩니다. 디버깅을 할 때 대개'(선언 (최적화) 디버그)'를 수행 한 다음 필요한 시스템을로드 (또는 필요한 경우 다시 컴파일)합니다. 이것은 파일에'declaim'을 변경/추가하는 번거 로움을 덜어줍니다. 경고 :'declaim'은'선언 '을 무시할 수 있습니다 (확실하지는 않습니다, 스펙을 읽으십시오). –

관련 문제