2009-07-24 1 views
-1

나는 한 번 인터뷰에서 다음 질문을 물었습니다. 누가 더 많은 것을 배울 수 있는지 알고 있다면 궁금 해서요. 인터넷 검색은 많은 도움이되지 못했습니다.로그 명령문이 프로그램 출력을 변경하는 이유는 무엇입니까?

테스트하려는 프로그램이 있다고 가정 해보십시오. 단일 로그 문을 추가하고 갑자기 예상 출력을 생성하는 프로그램이 예상 출력을 생성하지 않습니다. 무슨 일이 일어 났을까요?

+0

'print ("카운터가"+ i ++ "에 있습니다.) \\ lol lol lol' – thecoshman

답변

3

아하. 나는 실제로 이런 일이 일어났습니다.

스택을 파괴하는 버그가있는 프로그램을 생각 해보자. 로그 또는 인쇄 문을 사용하면 로그를 호출하면 스택이 동작을 변경시킬만큼 충분히 이동할 수 있습니다.

예를 보여주는 방법을 생각하는 것이 흥미로운 문제입니다. 아마도 printf에서 잘못된 형식으로 처리하는 것이 가장 쉽습니다 ...

좋습니다. 개요는 적어도 다음과 같습니다.

int parent(){ ... printf("%s\n", itoa(child())); 

int child(){ 
    int num; 
    scanf("%d%d", num); /* notice the format; scanf is going to eat more of the 
          * stack than it should. 
          */ 
    return num;   /* but this return may unwind the stack successfully. */ 
} 

반품하기 전에 printf()을 삽입하면 문제가 발생합니다.

+0

"스택으로 보내고 있습니다 "? 명사는 동사가 아니며, 그렇다면이 맥락에서 나는 중국의 명나라 왕조와 어떤 관계가 있는지 보지 못한다. –

+0

+1 : 이것 역시 보았습니다. 디버깅은 끔찍한 일입니다. –

+0

@Colin Minging은 못생긴 영국 속어입니다. 그래서 이것을 uglifying :-)로 읽습니다. –

2

프로그램에 동시 스레드간에 경쟁 조건이있을 수 있으므로 타이밍을 변경하면 프로그램 동작이 변경 될 수 있습니다.

보통 이것은 다른 방법으로 훨씬 더 나쁩니다 (이른바 Heisenbug) : 프로그램이 잘못되어 로그 출력을 추가하여 디버깅하려고합니다. 그러나 로그 출력으로 인해 문제가 사라지므로 진단하기가 매우 어려워집니다.