Home > CS > 2024 > πŸ’Ύ [CS] μŠ€νƒ 트레이슀(Stack Trace)λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸ’Ύ [CS] μŠ€νƒ 트레이슀(Stack Trace)λž€ λ¬΄μ—‡μΌκΉŒμš”?
CS

πŸ’Ύ [CS] μŠ€νƒ 트레이슀(Stack Trace)λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • μŠ€νƒ 트레이슀(Stack Trace)λŠ” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μ˜ˆμ™Έ(Exception)κ°€ λ°œμƒν–ˆμ„ λ•Œ, μ˜ˆμ™Έκ°€ λ°œμƒν•œ 지점과 κ·Έ μ˜ˆμ™Έλ‘œ 이어진 ν•¨μˆ˜ 호좜 경둜λ₯Ό λ³΄μ—¬μ£ΌλŠ” 디버깅 μ •λ³΄μž…λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 κ°œλ°œμžλŠ” μ–΄λ–€ μ˜ˆμ™Έκ°€ μ–΄λ””μ„œ λ°œμƒν–ˆλŠ”μ§€, 그리고 κ·Έ μ˜ˆμ™Έκ°€ μ–΄λ–»κ²Œ λ°œμƒν–ˆλŠ”μ§€λ₯Ό νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ μŠ€νƒ 트레이슀(Stack Trace)의 μ—­ν• .

1️⃣ 디버깅.

  • μŠ€νƒ 트레이슀(Stack Trace)λ₯Ό 톡해 μ˜ˆμ™Έκ°€ λ°œμƒν•œ μœ„μΉ˜λ₯Ό μ •ν™•νžˆ μ°Ύμ•„λ‚΄κ³ , 문제λ₯Ό μ‹ μ†ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ 문제의 원인 νŒŒμ•….

  • μŠ€νƒ 트레이슀(Stack Trace)λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•˜κΈ° μ „κΉŒμ§€ μ–΄λ–€ ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€λ₯Ό μˆœμ„œλŒ€λ‘œ 보여주기 λ•Œλ¬Έμ— λ¬Έμ œμ™€ 원인을 좔적할 수 μžˆλŠ” μ€‘μš”ν•œ λ‹¨μ„œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

4️⃣ 호좜 경둜 이해.

  • ν”„λ‘œκ·Έλž¨μ—μ„œ ν•¨μˆ˜ 호좜 경둜λ₯Ό μ΄ν•΄ν•˜λŠ” 데 도움을 μ£Όμ–΄, μ½”λ“œμ˜ 흐름을 νŒŒμ•…ν•˜κ³  μˆ˜μ •ν•  수 있게 ν•©λ‹ˆλ‹€.

2️⃣ μŠ€νƒ 트레이슀의 ꡬ쑰.

  • μŠ€νƒ 트레이슀(Stack Trace)λŠ” 일반적으둜 μ˜ˆμ™Έμ˜ μ’…λ₯˜μ™€ λ©”μ‹œμ§€, 그리고 ν•¨μˆ˜ 호좜 μŠ€νƒμ˜ λͺ©λ‘μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.
    • 각 ν•­λͺ©μ€ λ‹€μŒ 정보λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
        1. μ˜ˆμ™Έμ˜ μ’…λ₯˜μ™€ λ©”μ‹œμ§€
        1. 호좜된 λ©”μ„œλ“œμ˜ λͺ©λ‘.

1️⃣ μ˜ˆμ™Έμ˜ μ’…λ₯˜μ™€ λ©”μ‹œμ§€.

  • μ˜ˆμ™Έμ˜ μœ ν˜•κ³Ό λ©”μ‹œμ§€λ₯Ό 톡해 μ˜ˆμ™Έμ˜ 원인에 λŒ€ν•œ 기본적인 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

2️⃣ 호좜된 λ©”μ„œλ“œμ˜ λͺ©λ‘.

  • μ˜ˆμ™Έκ°€ λ°œμƒν•œ μ‹œμ κΉŒμ§€μ˜ ν•¨μˆ˜ 호좜 경둜λ₯Ό μœ„μ—μ„œλΆ€ν„° μ•„λž˜λ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€.
    • κ°€μž₯ μœ„μ˜ ν•­λͺ©μ€ μ˜ˆμ™Έκ°€ μ‹€μ œλ‘œ λ°œμƒν•œ λ©”μ„œλ“œμ΄λ©°, κ·Έ μ•„λž˜λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•˜κΈ°κΉŒμ§€ 호좜된 λ©”μ„œλ“œλ“€μ΄ ν‘œμ‹œλ©λ‹ˆλ‹€.

3️⃣ μŠ€νƒ 트레이슀 μ˜ˆμ‹œ (Java)

  • μ•„λž˜μ˜ μ½”λ“œλŠ” Java ν”„λ‘œκ·Έλž¨μ—μ„œ NullPointerException이 λ°œμƒν–ˆμ„ λ•Œμ˜ μŠ€νƒ 트레이슀 μ˜ˆμ‹œμž…λ‹ˆλ‹€.
public class StackTraceExample {
    public static void main(String[] args) {
        firstMethod();
    }
    
    public static void firstMethod() {
        secondMethod();
    }
    
    public static void secondMethod() {
        String str = null;
        str.length(); // μ—¬κΈ°μ—μ„œ NullPointerException λ°œμƒ
    }
}

πŸ‘‰ 좜λ ₯λ˜λŠ” μŠ€νƒ 트레이슀.

Excption in thread "main" java.lang.NullPointerException
    at StackTraceExample.secondMethod(StackTraceExample.java:14)
    at StackTraceExample.firstMethod(StackTraceExample.javee:9)
    at StackTraceExample.main(StackTraceExample.java:5)

4️⃣ μŠ€νƒ 트레이슀의 ꡬ성 μš”μ†Œ.

1️⃣ μ˜ˆμ™Έμ˜ μ’…λ₯˜μ™€ λ©”μ‹œμ§€.

  • Exception in thread "main" java.lang.NullPointerException
    • ν”„λ‘œκ·Έλž¨μ˜ 메인 μŠ€λ ˆλ“œμ—μ„œ NullPointerException이 λ°œμƒν–ˆλ‹€λŠ” 것을 μ•Œλ €μ€λ‹ˆλ‹€.

2️⃣ 호좜된 λ©”μ„œλ“œμ˜ λͺ©λ‘.

  • at StackTraceExample.secondMethod(StackTraceExample.java:14)
    • secondMethod λ©”μ„œλ“œμ˜ 14번째 μ€„μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.
  • at StackTraceExample.firstMethod(StackTraceExample.java:9)
    • firstMethodκ°€ secondMethodλ₯Ό ν˜ΈμΆœν–ˆμŠ΅λ‹ˆλ‹€.
  • at StackTraceExample.main(StackTraceExample.java:5)
    • main λ©”μ„œλ“œκ°€ firstMethodλ₯Ό ν˜ΈμΆœν–ˆμŠ΅λ‹ˆλ‹€.
  • μŠ€νƒ 트레이슀(Stack Trace)λŠ” κ°€μž₯ μ΅œκ·Όμ— 호좜된 λ©”μ„œλ“œ(μ˜ˆμ™Έκ°€ λ°œμƒν•œ λ©”μ„œλ“œ)λΆ€ν„° μ‹œμž‘ν•˜μ—¬, μ˜ˆμ™Έκ°€ λ°œμƒν•˜κΈ° 전에 호좜된 λ©”μ„œλ“œλ“€μ„ 순차적으둜 ν‘œμ‹œν•©λ‹ˆλ‹€.

5️⃣ μŠ€νƒ 트레이슀의 μ€‘μš”μ„±.

1️⃣ 였λ₯˜μ˜ 원인 νŒŒμ•….

  • μŠ€νƒ 트레이슀λ₯Ό 보면, μ˜ˆμ™Έκ°€ λ°œμƒν•œ μ •ν™•ν•œ μœ„μΉ˜μ™€ μ–΄λ–€ ν•¨μˆ˜μ—μ„œ 호좜된 것인지λ₯Ό μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 였λ₯˜μ˜ 원인을 μ‹ μ†ν•˜κ²Œ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, μœ„μ˜ μŠ€νƒ 트레이슀(Stack Trace)μ—μ„œλŠ” secondMethod의 str.length() ν˜ΈμΆœμ—μ„œ NullPointerException이 λ°œμƒν–ˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • κ·Έ μ΄ν›„μ—λŠ” firstMethodκ°€ 이 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν–ˆκ³ , μ΅œμ’…μ μœΌλ‘œ main λ©”μ„œλ“œμ—μ„œ firstMethodκ°€ ν˜ΈμΆœλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

2️⃣ 디버깅 μ‹œκ°„ 단좕.

  • μŠ€νƒ 트레이슀(Stack Trace)λŠ” μ˜ˆμ™Έμ˜ 원인을 μ •ν™•ν•˜κ²Œ 지λͺ©ν•˜κΈ° λ•Œλ¬Έμ—, κ°œλ°œμžκ°€ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜κ³  λ””λ²„κΉ…ν•˜λŠ” μ‹œκ°„μ„ 단좕할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 디버거λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ 문제의 κ·Όλ³Έ 원인을 λΉ λ₯΄κ²Œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ 호좜 경둜 이해.

  • μ½”λ“œμ˜ 흐름을 μ΄ν•΄ν•˜λŠ” 데 두움을 μ€λ‹ˆλ‹€.
    • 특히, λ³΅μž‘ν•œ ν”„λ‘œκ·Έλž¨μ΄λ‚˜ νƒ€μ‚¬μ˜ μ½”λ“œλ₯Ό λ‹€λ£° λ•Œ μŠ€νƒ 트레이슀(Stack Trace)λŠ” μ½”λ“œκ°€ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€μ— λŒ€ν•œ μ€‘μš”ν•œ λ‹¨μ„œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

6️⃣ μŠ€νƒ 트레이슀 μ½λŠ” 방법.

1️⃣ μ˜ˆμ™Έ λ©”μ‹œμ§€λ₯Ό 확인.

  • μ˜ˆμ™Έ λ©”μ‹œμ§€λŠ” 문제의 μ’…λ₯˜μ™€ 원인에 λŒ€ν•΄ 첫 번째 힌트λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, NullPointException은 널 객체에 μ ‘κ·Όν•˜λ €κ³  ν–ˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

2️⃣ κ°€μž₯ μœ„μ˜ 호좜 μœ„μΉ˜ μ°ΎκΈ°.

  • μŠ€νƒ 트레이슀(Stack Trace)μ—μ„œ κ°€μž₯ μœ„μ˜ 호좜 μœ„μΉ˜λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•œ μ •ν™•ν•œ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • 이 λΆ€λΆ„λΆ€ν„° 문제λ₯Ό μΆ”μ ν•˜κΈ° μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

3️⃣ 호좜 μˆœμ„œλŒ€λ‘œ 확인.

  • μ˜ˆμ™Έκ°€ λ°œμƒν•œ μ½”λ“œμ˜ 흐름을 μ΄ν•΄ν•˜λ €λ©΄ 호좜 μˆœμ„œλŒ€λ‘œ 각 λ©”μ„œλ“œκ°€ μ–΄λ–€ 역할을 ν•˜λŠ”μ§€ λΆ„μ„ν•©λ‹ˆλ‹€.
    • 이 과정을 톡해 λ¬Έμ œκ°€ μžˆλŠ” 뢀뢄을 λΉ λ₯΄κ²Œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

7️⃣ μŠ€ν… 트레이슀λ₯Ό μœ μš©ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 방법.

1️⃣ λ‘œκΉ…(logging)κ³Ό 함꼐 μ‚¬μš©.

  • μ‹€μ œλ‘œ 배포된 μ†Œν”„νŠΈμ›¨μ–΄μ—μ„œλŠ” 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ λ‘œκ·Έμ— μŠ€νƒ 트레이슀(Stack Trace)λ₯Ό κΈ°λ‘ν•˜λ„λ‘ μ„€μ •ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 μ‚¬μš©μžκ°€ 였λ₯˜λ₯Ό λ³΄κ³ ν–ˆμ„ λ•Œ, κ°œλ°œμžκ°€ μ‰½κ²Œ 문제의 원인을 νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Javaμ—μ„œλŠ” μ˜ˆμ™Έλ₯Ό μž‘μ„ λ•Œ e.printStackTrace()λ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€νƒ 트레이슀(Stack Trace)λ₯Ό 좜λ ₯ν•˜κ±°λ‚˜, λ‘œκΉ… ν”„λ ˆμž„μ›Œν¬(logging framework)λ₯Ό μ‚¬μš©ν•˜μ—¬ 둜그 νŒŒμΌμ— 기둝할 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μ˜ˆμ™Έ μ²˜λ¦¬μ—μ„œ μŠ€νƒ 트레이슀 ν™œμš©.

  • μ˜ˆμ™Έλ₯Ό μž‘μ•„μ„œ μ²˜λ¦¬ν•  λ•Œ, μŠ€νƒ 트레이슀λ₯Ό 좜λ ₯ν•¨μœΌλ‘œμ¨ 디버깅에 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 특히, μ˜ˆμƒν•˜μ§€ λͺ»ν•œ μ˜ˆμ™Έλ₯Ό 디버깅할 λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

8️⃣ μš”μ•½.

  • μŠ€νƒ 트레이슀(Stack Trace)λŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ˜ˆμ™Έμ˜ 원인과 호좜 경둜λ₯Ό λ³΄μ—¬μ£ΌλŠ” 디버깅 μ •λ³΄μž…λ‹ˆλ‹€.
  • μ˜ˆμ™Έμ˜ μ’…λ₯˜μ™€ λ©”μ‹œμ§€, 그리고 ν•¨μˆ˜ 호좜 μŠ€νƒ λͺ©λ‘μœΌλ‘œ κ΅¬μ„±λ˜μ–΄ 있으며, 문제λ₯Ό μΆ”μ ν•˜κ³  ν•΄κ²°ν•˜λŠ” 데 큰 도움이 λ©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 κ°œλ°œμžλŠ” μ½”λ“œμ˜ 흐름을 μ΄ν•΄ν•˜κ³ , μ˜ˆμ™Έκ°€ λ°œμƒν•œ μ •ν™•ν•œ μœ„μΉ˜μ™€ 원인을 νŒŒμ•…ν•˜μ—¬ 디버깅 μ‹œκ°„μ„ 단좕할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μŠ€νƒ 트레이슀(Stack Trace)λŠ” 특히 λ‘œκΉ…(logging)κ³Ό κ²°ν•©ν•˜μ—¬ μ‚¬μš©ν•˜λ©΄, 배포된 μ†Œν”„νŠΈμ›¨μ–΄μ˜ 문제λ₯Ό μ§„λ‹¨ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€.