스택 추적 시작

위에서부터 시작하겠습니다. 스택 추적이란 무엇입니까? 용어를 들어 본 적이 없더라도 한번쯤 접해보셨을 것입니다. 스택 추적은 코드에서 오류를 트리거할 때 터미널 또는 로그에 나타나는 복잡한 텍스트 청크의 이름입니다. 그런데 이름이 왜?

코드를 스택으로 이해하기



프로그래밍에서 데이터 유형으로서의 스택에 익숙할 것입니다. LIFO(후입 선출)를 사용하여 작동합니다. 스택에서 무언가를 "팝(pop)"하거나 스택에 무언가를 "푸시(push)"합니다. 스택에 계속 추가하면 항목이 시작/종료 지점에서 더 멀리 밀려납니다.



스택을 사용하여 해결하는 postfix calculator에 대해 들어 보셨습니까? 코드는 유사하게 작동하며 호출 스택이라는 것을 생성합니다. 코드 라인을 호출하면 스택에 푸시됩니다. 코드 호출 라인이 스택에 푸시되는 메서드도 있습니다. 이것은 해당 라인의 가장 낮은 빌딩 블록을 만날 때까지 래빗 홀 아래로 계속 발생합니다. 해당 코드 조각을 해결하고 스택을 통해 작업을 시작합니다. 스택에서 무언가를 꺼낼 때마다 그것을 해결하고 그 결과를 스택의 다음 항목에 사용합니다. 결국 해당 코드의 초기 라인에 도달하고 이를 해결하여 빈 스택을 남깁니다.

좋아요, 그게 왜 중요한가요?



코드를 스택으로 이해하는 것은 스택 추적을 이해하는 데 중요합니다. 스택 추적은 작성한 코드 조각을 해결하려고 시도하는 동안 이루어진 다양한 호출을 모두 보여주기 때문입니다. 해당 호출 스택의 어딘가에서 오류가 발생했고 시스템은 사용할 결과 없이 스택에서 항목을 계속 팝할 수 없었습니다.

그러나 이는 스택 추적에 오류를 일으킨 줄을 포함하지 않을 수 있음을 의미합니다. 무엇을 기다립니다?!

이렇게 생각해보세요. 작성한 코드 조각이 하위 수준에서 오류를 트리거합니다. 해당 수준이 스택 추적에서 너무 아래에 있는 경우 초기 범인을 알 수 없는 방식으로 메시지가 잘릴 수 있습니다.

스택 추적을 읽는 방법



이 거대한 텍스트 혼란을 볼 때 실제로 무엇을 찾고 있습니까? 현실은 스택 추적의 각 라인이 "호출"된 코드 조각이라는 것입니다. 그러나 당신은 자신도 모르게 그렇게 했을 가능성이 있으므로 특별히 도움이 되지는 않습니다.

찾고 있는 것은 작성한 코드 조각에 대한 첫 번째 참조입니다. 오류에 보다 직접적으로 매핑할 수 있도록 줄 번호가 포함되는 경우가 많습니다. 때로는 스택 추적이 사용자가 작성한 코드만 참조하지만 항상 그런 것은 아닙니다.

라이브러리 코드 스택 추적



가장 복잡한 스택 추적은 사용자가 작성한 코드에 의해 타사 라이브러리에서 오류가 발생한 경우가 많습니다. 이 경우 인식하는 파일에 대한 참조를 찾기 전에 많은 줄을 살펴볼 수 있습니다. 스택 추적의 나머지 부분이 변경할 수 있는 코드를 가리키지는 않지만 덜 중요하지는 않습니다.

왜요? 글쎄, 그것은 오류가 궁극적으로 어디에서 왔는지 알려줍니다. 코드의 어느 부분이 규칙을 위반했는지. 종종 참조된 라이브러리 파일을 IDE에서 볼 수 있습니다. 당신이 그들에 뛰어 들면 당신이 쓴 것이 어디에서 잘못되었는지 알아낼 수 있습니다.

그 캐치 비즈니스는 어떻습니까?



코드를 작성할 때 엣지 케이스를 고려하고 방어적으로 프로그래밍해야 합니다. 많은 경우에 이것은 예외를 포착하고 더 구체적인 예외를 원인으로 던지는 것을 의미합니다.

public void getPost(int id) {
     try {
        post.getId(id);    // this method throws a NullPointerException
     } catch (NullPointerException e) {
         throw new IllegalStateException("Post has a null property", e)
     }
}

이 작업을 수행하는 코드는 표시되는 스택 추적에 영향을 미칩니다. "연결된 예외"가 포함된 스택 추적을 제공합니다.

Exception in thread "main" java.lang.IllegalStateException: A post has a null property
        at com.example.myproject.Author.getPost(Author.java:38)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
        at com.example.myproject.Post.getId(Post.java:22)
        at com.example.myproject.Author.getPost(Author.java:36)
        ... 1 more

이것이 당신을 혼란스럽게 하지 마십시오. 당신은 여전히 ​​당신이 인식하는 것에 대한 가장 초기의 언급을 찾고 있습니다.

다른 모든 것이 실패하면



스택 추적을 읽는 방법을 배우는 것은 연습된 기술입니다. 디버깅에 대한 다른 팁을 원하시면 여기에 게시물을 작성했습니다.


좋은 웹페이지 즐겨찾기