error-detective
npx skills add https://github.com/icartsh/icartsh_plugin --skill error-detective
Agent 安装分布
Skill 文档
Error Detective – Systematic Debugging and Error Resolution
ê°ì (Overview)
Error Detectiveë ìë¬ë¥¼ í¨ì¨ì ì¼ë¡ ìë³, ë¶ì ë° í´ê²°í기 ìí´ ì²´ê³ì ì¸ ë°©ë²ë¡ ì ì ì©íë ì¢ í©ì ì¸ ëë²ê¹ SKILLì ëë¤. TRACE íë ììí¬ì 구조íë ë¶ì 기ë²ì ì¬ì©íì¬ ìë¬ì ì´ê¸° ë°ê²¬ë¶í° ê²ì¦ë í´ê²°ê¹ì§ ëë²ê¹ ê³¼ì ì ìë´í©ëë¤.
íµì¬ ìë (Core Capabilities)
ì¤í í¸ë ì´ì¤ ë¶ì (Stack Trace Analysis)
- ì¬ë¬ ì¸ì´ì ê±¸ì¹ ì¤í í¸ë ì´ì¤ íì± ë° í´ì
- 근본 ìì¸(root cause)ê³¼ ì¦ì ìë¬(symptom errors) 구ë¶
- ê´ë ¨ íì¼ ê²½ë¡ ë° ë¼ì¸ ë²í¸ ì¶ì¶
- í¸ì¶ ì²´ì¸ ë° ìë¬ ì í ê³¼ì ì´í´
ìë¬ í¨í´ ì¸ì (Error Pattern Recognition)
- ì íë³ ìë¬ ë¶ë¥ (syntax, runtime, logic, integration)
- ê³µíµ ìë¬ í¨í´ ë° ìí° í¨í´ ìë³
- íë ììí¬ë³ í¹í ìë¬ ì¸ì
- ìë¬ë¥¼ ë°ì ê°ë¥í 근본 ìì¸ì 매í
근본 ìì¸ ë¶ì (Root Cause Analysis)
- ì¦ìê³¼ 기ì ì´ìì 구ë¶
- ìë¬ ì²´ì¸ì ë°ë¼ ìë ë°ì ì§ì ì¶ì
- íê²½ ì´ìì ì½ë ì´ìì ì¤ë³
- ì¤ì ë° ì¢ ìì± ë¬¸ì ê°ì§
ëë²ê¹ ìí¬íë¡ì° ê´ë¦¬
- 구조íë ì¡°ì¬ íë¡ì¸ì¤
- ê°ì¤ ìì± ë° í ì¤í¸
- ì´í´ëì ëí ë°ë³µì ì ë°í
- ì¡°ì¬ ê²°ê³¼ ë° í´ê²°ì± 문ìí
TRACE íë ììí¬
TRACEë ì´ë¤ ìë¬ë ëë²ê¹ í ì ìë ì²´ê³ì ì¸ 5ë¨ê³ ì ê·¼ ë°©ìì ëë¤:
T – Trace the Error (ìë¬ ì¶ì )
목í: ìì í ìë¬ ì ë³´ì 컨í ì¤í¸ 캡ì²
-
ì ì²´ ìë¬ ë©ìì§ ìì§
- ì ì²´ ì¤í í¸ë ì´ì¤ (ì²ì ëª ì¤ë§ì´ ìë ì ì²´)
- ìë¬ ì í ë° ë©ìì§
- íìì¤í¬í ë° ë°ì ë¹ë
- ìë¬ê° ë°ìí íê²½
-
ìë¬ ìì¹ ìë³
- ì íí íì¼ ë° ë¼ì¸ ë²í¸
- ìë¬ê° ë°ìí í¨ì ëë ë©ìë
- ì½ë 컨í ì¤í¸ (ì£¼ë³ ë¼ì¸)
- ì§ì ì ë¶í° ìë¬ ì§ì ê¹ì§ì í¸ì¶ ì¤í
-
ì¬í ë¨ê³ ê°ë¬´ë¦¬
- ì¬íì ìí ìµìíì ë¨ê³
- ì¬ì©ë ì ë ¥ ë°ì´í° ëë íë¼ë¯¸í°
- 기ë ê²°ê³¼ vs. ì¤ì ëì
- ì¬íì ì¼ê´ì± (íì ë°ì, ê°íì ë°ì, ëë¬¼ê² ë°ì)
R – Read the Error Message (ìë¬ ë©ìì§ ì½ê¸°)
목í: ìë¬ ìì²´ìì 모ë ì ë³´ ì¶ì¶
-
ìë¬ êµ¬ì± ìì íì±
- ìë¬ ì í/í´ëì¤ (TypeError, ValueError ë±)
- ìë¬ ë©ìì§ ë´ì©
- ê¶ì¥ ìì ì¬í (ì ê³µëë ê²½ì°)
- ê´ë ¨ ìë¬ ëë ê²½ê³
-
ìë¬ ìë§¨í± ì´í´
- í´ë¹ ì¸ì´/íë ììí¬ìì í´ë¹ ìë¬ ì íì´ ì미íë ë°
- ì´ë¤ ì¡°ê±´ì´ ì´ ìë¬ë¥¼ ì ë°íëì§
- ìë¬ ë©ìì§ê° 구체ì ì¼ë¡ 무ìì ë§íê³ ìëì§
- ìë¬ ì½ë ëë ìí ì½ë
-
ìë¬ ì¹´í ê³ ë¦¬ ìë³
- Syntax error (ì½ë íì± ë¶ê°)
- Runtime error (ì¤í ì¤ í¬ëì ë°ì)
- Logic error (ê²°ê³¼ê° í림, í¬ëì ìì)
- Integration error (ì¸ë¶ ìì¤í ì¤í¨)
- Performance error (íììì, 리ìì¤ ê³ ê°)
A – Analyze the Context (컨í ì¤í¸ ë¶ì)
목í: ìë¬ ì£¼ë³ì ë ëì 컨í ì¤í¸ ì´í´
-
ì½ë ë¶ì
- ì¤í¨í ë¼ì¸ê³¼ ì£¼ë³ ì½ë ê²í
- í´ë¹ ì½ëì ìµê·¼ ë³ê²½ ì¬í íì¸
- í¨ì/ë©ìë ìê·¸ëì² ë° ì¬ì©ë² ê²í
- ì¤í¨í ì½ë를 í¸ì¶íê±°ë í¸ì¶ëë ê´ë ¨ ì½ë ê²í
-
ë°ì´í° ë¶ì
- ì¤í¨ ìì ì ì ë ¥ê° ì¡°ì¬
- ë°ì´í° íì ë° êµ¬ì¡° íì¸
- ë°ì´í°ê° ììë íì/ì ì½ ì¬íì 충족íëì§ ê²ì¦
- ì£ì§ ì¼ì´ì¤(edge cases) ëë ììì¹ ëª»í ê° ìë³
-
íê²½ ë¶ì
- ì¢ ìì± ë° ë²ì íì¸
- ì¤ì íì¼ ê²í
- íê²½ ë³ì ê²ì¦
- íìí 리ìì¤(íì¼, ë¤í¸ìí¬, ë©ëª¨ë¦¬) ê°ì©ì± íì¸
-
ìí ë¶ì
- ìë¬ ë°ì ìì ì ì í리ì¼ì´ì ìí
- ì´ ìíë¡ ì´ì´ì§ ì´ì ìì ë¤
- ê´ë ¨ë ê³µì ìí ëë ì ì ë³ì
- ë°ì´í°ë² ì´ì¤ ëë ì¸ë¶ ìì¤í ìí
C – Check for Root Cause (근본 ìì¸ íì¸)
목í: ë¨ìí ì¦ìì´ ìë 기ì ì ì´ì ì¤ë³
-
ìë¬ ì²´ì¸ ì¶ì
- ì¤í í¸ë ì´ì¤ì 맨 ìë(첫 ë²ì§¸ ìë¬)ë¶í° ìì
- ììë¡ ê±°ì¬ë¬ ì¬ë¼ê°ë©° ìë ìì¸ íì
- ìë¬ ë°ì ì§ì ê³¼ ìë¬ í¸ë¤ë¬ 구ë¶
- ëíëê±°ë ë¤ì ëì ¸ì§(re-thrown) ìë¬ ìë³
-
ê°ì¤ í ì¤í¸
- 구체ì ì´ê³ í ì¤í¸ ê°ë¥í ê°ì¤ ìì±
- ë³ì 격리 (í ë²ì íëì© ë³ê²½)
- ë¡ê¹ /ëë²ê¹ ë구를 ì¬ì©íì¬ ê°ì ê²ì¦
- íì¸ëê±°ë 기ê°ë ê°ì¤ 문ìí
-
ì¼ë°ì ì¸ ê·¼ë³¸ ìì¸
- Null/undefined ê°: ì´ê¸°í ëë ê²ì¦ ëë½
- íì ë¶ì¼ì¹ (Type mismatches): ì못ë ë°ì´í° íì ì ë¬ ëë ë°í
- Off-by-one ìë¬: ë°°ì´/루í ê²½ê³ ì´ì
- ê²½í© ì¡°ê±´ (Race conditions): íì´ë°ì ë°ë¥¸ ì¤í¨
- 리ìì¤ ê³ ê°: ë©ëª¨ë¦¬, ëì¤í¬, 커ë¥ì ë¶ì¡±
- ì¤ì ìë¬ (Configuration errors): ì못ë ì¤ì ëë ëë½ë ì¤ì
- ì¢ ìì± ì´ì (Dependency issues): ë²ì ì¶©ë ëë ëë½ë ë¼ì´ë¸ë¬ë¦¬
- ê¶í ìë¬: ë¶ì¶©ë¶í ì ì ê¶í
- ë¤í¸ìí¬ ìë¬: ì°ê²°ì±, íììì, DNS ì´ì
- ë°ì´í° ìì: ì í¨íì§ ìê±°ë ììì¹ ëª»í ë°ì´í° íì
E – Execute the Fix (ìì ì¤í)
목í: í´ê²°ì± 구í ë° ê²ì¦
-
ìì ì¤ê³
- ì¦ìì´ ìë 근본 ìì¸ í´ê²°
- ë¶ì í¨ê³¼(side effects) ë° ì£ì§ ì¼ì´ì¤ ê³ ë ¤
- íìí ê²½ì° íì í¸íì± ê³í
- ê°ì¥ ì ì§ë³´ìí기 ì¬ì´ í´ê²°ì± ì í
-
ì ì¤í 구í
- ìµìíì íê²í ë ë³ê²½ ì¤ì
- ê²ì¦ ë° ìë¬ í¸ë¤ë§ ì¶ê°
- í¥í ëë²ê¹ ì ìí ë¡ê¹ í¬í¨
- ìì ë´ì© ë° ê·¼ê±° 문ìí
-
ì² ì í ê²ì¦
- ìë ìë¬ê° í´ê²°ëìëì§ íì¸
- ì¬í ë¨ê³ë¥¼ íµí´ í ì¤í¸
- ì£ì§ ì¼ì´ì¤ ë° ê´ë ¨ ê¸°ë¥ í ì¤í¸
- ìë¡ì´ ìë¬ê° ëì ëì§ ììëì§ íì¸
-
문ìí ë° ë°©ì§
- ìë¬ ì ë° ìì¸ ë¬¸ìí
- í´ê²°ì± ë° ìë ì´ì 문ìí
- íê·(regression) ë°©ì§ë¥¼ ìí í ì¤í¸ ì¶ê°
- íìí ê²½ì° ë¬¸ì ì ë°ì´í¸ ëë ê²½ê³ ì¶ê°
ëë²ê¹ ìí¬íë¡ì°
ì´ê¸° íê° (5ë¶)
1. ì ì²´ ìë¬ ë©ìì§ ì½ê¸°
2. ìë¬ ì í ë° ì¬ê°ë ìë³
3. ìë¬ ì¬í ê°ë¥ ì¬ë¶ íì¸
4. ìí¥ë íê° (ì°¨ë¨í, ì±ë¥ ì í, ë¨ì ì¸ê´ì 문ì )
5. ì¡°ì¬ ì°ì ìì ê²°ì
ì¬ì¸µ ì¡°ì¬ (15-30ë¶)
1. TRACE íë ììí¬ë¥¼ ì²´ê³ì ì¼ë¡ ì ì©
2. ëë²ê¹
ë구 ì¬ì© (scripts/debug_helper.py 참조)
3. ê°ì¤ ìì± ë° í
ì¤í¸
4. ì§ííë©´ì ë°ê²¬ ì¬í 문ìí
5. 근본 ìì¸ì¼ë¡ ì¢í기
í´ê²°ì± 구í (ìí©ì ë°ë¼ ë¤ë¦)
1. 근본 ìì¸ì í´ê²°íë ìì ì¤ê³
2. ì ì í ìë¬ í¸ë¤ë§ê³¼ í¨ê» 구í
3. ë¡ê¹
ë° ê²ì¦ ì¶ê°
4. ì² ì í í
ì¤í¸
5. í´ê²°ì±
문ìí
ê²ì¦ ë° ë°©ì§ (10ë¶)
1. ìëì ì¬í ë¨ê³ë¡ ìì ì¬í ê²ì¦
2. ê´ë ¨ ê¸°ë¥ í
ì¤í¸
3. íê· í
ì¤í¸ ì¶ê°
4. 문ì ì
ë°ì´í¸
5. ë°°í¬ ë° ëª¨ëí°ë§
ì¸ì´ë³ ê³µíµ ìë¬ í¨í´
Python
AttributeError: ‘NoneType’ has no attribute ‘X’
- 근본 ìì¸: ê°ì²´ë¥¼ 기ëíì¼ë ë³ìê° Noneì
- ì²´í¬ ì¬í: ì´ê¸°í, í¨ì ë°íê°, API ìëµ
- í´ê²°ì± : Null ì²´í¬ ì¶ê°, ì ì í ì´ê¸°í ë³´ì¥
KeyError: ‘key_name’
- 근본 ìì¸: ëì ë리ì 기ëí í¤ê° ìì
- ì²´í¬ ì¬í: ë°ì´í° ìì¤, íì± ë¡ì§, í¤ ì² ì
- í´ê²°ì± : ëí´í¸ê°ê³¼ í¨ê» .get() ì¬ì©, ë°ì´í° 구조 ê²ì¦
ImportError / ModuleNotFoundError
- 근본 ìì¸: 모ëì´ ì¤ì¹ëì§ ììê±°ë ê²½ë¡ì ìì
- ì²´í¬ ì¬í: requirements.txt, ê°ì íê²½, PYTHONPATH
- í´ê²°ì± : ëë½ë í¨í¤ì§ ì¤ì¹, ìí¬í¸ ê²½ë¡ ìì
IndentationError
- 근본 ìì¸: ì¼ê´ëì§ ìì ì¬ë°± (í vs 공백)
- ì²´í¬ ì¬í: ìëí° ì¤ì , ë³µì¬ë ì½ë
- í´ê²°ì± : 공백(PEP 8)ì¼ë¡ íì¤í, linter ì¬ì©
JavaScript/TypeScript
TypeError: Cannot read property ‘X’ of undefined
- 근본 ìì¸: undefined ê°ì²´ì íë¡í¼í°ì ì ê·¼
- ì²´í¬ ì¬í: ê°ì²´ ì´ê¸°í, ë¹ë기 íì´ë°, API ìëµ
- í´ê²°ì± : ìµì ë ì²´ì´ë(?. ì°ì°ì), null ì²´í¬
ReferenceError: X is not defined
- 근본 ìì¸: ì ì¸ ì ë³ì ì¬ì© ëë ì¤ì½í ë²ì´ë¨
- ì²´í¬ ì¬í: ë³ì ì ì¸, ì¤ì½í, í¸ì´ì¤í (hoisting) ì´ì
- í´ê²°ì± : ë³ì ì ì¸, ì¤ì½í ìì , ìí¬í¸ íì¸
Promise rejection / Uncaught (in promise)
- 근본 ìì¸: catch í¸ë¤ë¬ ìì´ ë¹ë기 ìì ì¤í¨
- ì²´í¬ ì¬í: API í¸ì¶, íì¼ ìì , async/await ì¬ì©
- í´ê²°ì± : .catch() ì¶ê° ëë awaitì í¨ê» try/catch ì¬ì©
SyntaxError: Unexpected token
- 근본 ìì¸: ì£¼ë¡ JSONì´ë ì½ë íì± ì¤ ë°ìíë ì í¨íì§ ìì 구문
- ì²´í¬ ì¬í: JSON 구조, ê´í¸ ì§ ë§ì¶ê¸°, ì¸ë¯¸ì½ë¡
- í´ê²°ì± : JSON ê²ì¦, 구문 ìì , ë³µì¬/ë¶ì¬ë£ê¸° ìë¬ íì¸
Java
NullPointerException
- 근본 ìì¸: null ê°ì²´ 참조ì ëí´ ë©ìë í¸ì¶
- ì²´í¬ ì¬í: ê°ì²´ ì´ê¸°í, ë©ìë ë°íê°
- í´ê²°ì± : Null ì²´í¬ ì¶ê°, Optional ì¬ì©, ì´ê¸°í ë³´ì¥
ClassNotFoundException
- 근본 ìì¸: classpathìì í´ëì¤ë¥¼ ì°¾ì ì ìì
- ì²´í¬ ì¬í: ì¢ ìì±, ë¹ë ì¤ì , í¨í¤ì§ 구조
- í´ê²°ì± : ì¢ ìì± ì¶ê°, classpath ìì , í¨í¤ì§/í´ëì¤ ì´ë¦ íì¸
ConcurrentModificationException
- 근본 ìì¸: ë°ë³µ(iteration) ì¤ì 컬ë ì ì´ ìì ë¨
- ì²´í¬ ì¬í: ì¤ì²© 루í, ë©í°ì¤ë ë©, iterator ì¬ì©
- í´ê²°ì± : iterator.remove(), CopyOnWriteArrayList ì¬ì© ëë ë기í(synchronization)
ìë¬ ì¬ê°ë ë¶ë¥
Critical (ì¦ì ìì )
- ì í리ì¼ì´ì í¬ëì ëë ìì ë¶ê°
- ë°ì´í° ìì¤ ëë ìì
- ë³´ì ì·¨ì½ì
- ì´ì íê²½ ì¤ë¨ (Outages)
- ê²°ì ëë í¸ëìì ì¤í¨
High (ì¡°ìí ìì )
- 주ì ê¸°ë¥ ê³ ì¥
- ì¬ì©ììê² ìí¥ì 주ë ì±ë¥ ì í
- ì¬ë¬ ì¬ì©ììê² ìí¥ì 주ë ìë¬
- ë³µì¡í í´ê²° ë°©ë²(Workarounds)
Medium (ìì ì¼ì ê³í)
- ë¶ê° ê¸°ë¥ ê³ ì¥
- ìí¥ëê° ìë ì¸ê´ì ì´ì
- ì¬ì´ í´ê²° ë°©ë²ì´ ìë ìë¬
- ì£ì§ ì¼ì´ì¤ ì¤í¨
Low (ë°±ë¡ê·¸)
- ì¸ê´ì ì´ì
- ì¬ìí ê°ì ì¬í
- ë문 ì£ì§ ì¼ì´ì¤
- ì¤ìíì§ ìì ê²½ê³
ëë²ê¹ ë구 ë° ê¸°ë²
ë¡ê¹ ëª¨ë² ì¬ë¡
import logging
# 구조íë ë¡ê¹
ì¤ì
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 컨í
ì¤í¸ì í¨ê» ë¡ê¹
logger = logging.getLogger(__name__)
logger.debug(f"Processing item: {item_id}, user: {user_id}")
logger.error(f"Failed to process: {error}", exc_info=True)
ì ëµì ì¤ë¨ì (Breakpoints)
- ìë¬ ë°ì ì§ì : ìë¬ ë°ì ìì ì íí ìí í¬ì°©
- ìë¬ ë°ì ì : ì ë ¥ê° ë° ì¬ì ì¡°ê±´ íì¸
- ìë¬ ë°ì í: ìë¬ ì í ê³¼ì ê´ì°°
- ê²°ì ì§ì (Decision points): ë¡ì§ ë¶ê¸°ì ê²ì¦
- 루í ë´ë¶: ë°ë³µ ë³ì íì¸
ì ëµì ì¸ Print ëë²ê¹
# 컨í
ì¤í¸ ì 보를 í¬í¨í ëë²ê·¸ ì¶ë ¥ ì¶ê°
print(f"DEBUG: function_name called with {param1=}, {param2=}")
print(f"DEBUG: variable state before operation: {var=}")
print(f"DEBUG: condition check: {condition=}, result: {result=}")
ì´ì§ íì ëë²ê¹ (Binary Search Debugging)
ìë¬ ìì¹ê° ë¶ë¶ëª í ë:
- ì½ë ê²½ë¡ ì¤ê°ì ì²´í¬í¬ì¸í¸ ì¶ê°
- ìë¬ê° ì²´í¬í¬ì¸í¸ ì´ì ì¸ì§ ì´íì¸ì§ íë¨
- ë¨ì ì ë°ì ëí´ ë°ë³µ
- ìë¬ ìì¹ì ë¹ ë¥´ê² ìë ´
ê³ ë¬´ ì¤ë¦¬ ëë²ê¹ (Rubber Duck Debugging)
ëêµ°ê°ìê²(í¹ì ì¬ë¬¼ìê²) ì½ë를 í ì¤ì© ì¤ëª í기:
- ê°ì ì ê²í íê² í¨
- ì¤ëª íë ì¤ì ìë¬ë¥¼ ë°ê²¬íë ê²½ì°ê° ë§ì
- ë³µì¡í ë¡ì§ì ëª ííê² í¨
- ì§ìì 공백ì ìë³í¨
Debug Helper ì¤í¬ë¦½í¸ ì¬ì©
scripts/debug_helper.py ì í¸ë¦¬í°ë ìëíë ë³´ì¡° 기ë¥ì ì ê³µí©ëë¤:
# íì¼ìì ì¤í í¸ë ì´ì¤ íì±
python scripts/debug_helper.py parse-trace error.log
# ìë¬ í¨í´ ì¶ì¶
python scripts/debug_helper.py analyze-log application.log
# ëë²ê·¸ ì¸ì
ìì (ë¡ê·¸ ìì±)
python scripts/debug_helper.py session start "Login error investigation"
# ì¸ì
ì ë
¸í¸ ì¶ê°
python scripts/debug_helper.py session note "Tested with different users - same error"
# í´ê²°ì±
ê³¼ í¨ê» ì¸ì
ì¢
ë£
python scripts/debug_helper.py session close "Fixed: Added null check for user.profile"
ëª¨ë² ì¬ë¡ (Best Practices)
ìíí ìì (Do’s)
- ìë¬ ë©ìì§ ì ì²´ ì½ê¸°: ì¸ë¶ ì¬íì ê±´ëë°ì§ ë§ì¸ì.
- ì¼ê´ë ì¬í: ëë²ê¹ ì ì ì 뢰í ì ìë ì¬í ë°©ë²ì íë³´íì¸ì.
- í ë²ì í ê°ì§ë§ ë³ê²½: 무ìì´ ë¬¸ì 를 í´ê²°íëì§ ê²©ë¦¬íì¸ì.
- ì§ííë©´ì 문ìí: ê°ì¤, í ì¤í¸, ë°ê²¬ ì¬íì 기ë¡íì¸ì.
- ë²ì ê´ë¦¬ ì¬ì©: ëë²ê¹ ì ì 커ë°íì¬ íìí ê²½ì° ëë릴 ì ìê² íì¸ì.
- í ì¤í¸ ì¶ê°: ìì í íê·ë¥¼ ë°©ì§íì¸ì.
- 근본 ìì¸ ìì : ì¦ììë§ ëì§íì§ ë§ì¸ì.
- ì§ì ê³µì : íì ìí´ í´ê²°ì± ì 문ìííì¸ì.
í¼í´ì¼ í ìì (Don’ts)
- ì¶ì¸¡íì§ ë§ ê²: ë°ì´í°ë¡ ê°ì ì ê²ì¦íì¸ì.
- ìë¬ ì½ê¸°ë¥¼ ê±´ëë°ì§ ë§ ê²: ìë¬ ë©ìì§ìë ì¤ìí ì ë³´ê° ë´ê²¨ ììµëë¤.
- ì¬ë¬ ê°ì§ë¥¼ ëìì ë³ê²½íì§ ë§ ê²: 무ìì´ í´ê²°íëì§ ì ì ìê² ë©ëë¤.
- ì¶©ëì ì¼ë¡ ì½ë를 ìì íì§ ë§ ê²: 먼ì 주ì ì²ë¦¬íê³ ì ê·¸ ì½ëê° ììëì§ ì´í´íì¸ì.
- ê²½ê³ ë¥¼ 무ìíì§ ë§ ê²: ì¤ëì ê²½ê³ ë ë´ì¼ì ìë¬ê° ë©ëë¤.
- ì´í´ ìì´ ìì íì§ ë§ ê²: ë¤ë¥¸ ê²ì ë§ê°ë¨ë¦´ ì ììµëë¤.
- í ì¤í¸ë¥¼ ìì§ ë§ ê²: ìì ì¬íì´ ìëíê³ ìë¡ì´ ì´ì를 ë§ë¤ì§ ìëì§ íì¸íì¸ì.
ì¼ë°ì ì¸ ëë²ê¹ ìë리ì¤
ìëë¦¬ì¤ 1: “ì´ì ë ëëë°”
ì ê·¼ ë°©ì:
- ìµê·¼ ë³ê²½ ì¬í íì¸ (git diff, git log)
- ì¢ ìì± ì ë°ì´í¸ ê²í
- íê²½ ë³ê²½ ì¬í íì¸
- ìê°ì ë°ë¥¸ ë¡ì§(time-dependent logic) íì
- íê²½ ê° ì¤ì ë¹êµ
ì¼ë°ì ì¸ ìì¸:
- ìµê·¼ ì½ë ë³ê²½
- ì ë°ì´í¸ë ì¢ ìì±
- ì¤ì ë³ê²½
- ë°ì´í°ë² ì´ì¤ ì¤í¤ë§ ë³ê²½
- ì¸ë¶ API ë³ê²½
- ì¸ì¦ì ë§ë£
ìëë¦¬ì¤ 2: “ë´ ì»´í¨í°ìì ëëë°”
ì ê·¼ ë°©ì:
- íê²½ ë¹êµ (OS, ì¢ ìì±, ì¤ì )
- íê²½ ë³ì íì¸
- íì¼ ê²½ë¡ ë° ê¶í ê²ì¦
- íê²½ ê° ë°ì´í° ë¹êµ
- íëì½ë©ë ê°ì ì¬í íì
ì¼ë°ì ì¸ ìì¸:
- ë¤ë¥¸ ì¢ ìì± ë²ì
- ëë½ë íê²½ ë³ì
- ë¤ë¥¸ íì¼ ê²½ë¡
- ë°ì´í°ë² ì´ì¤ ìí ì°¨ì´
- ì´ì ì²´ì ì°¨ì´
- ëë½ë ì¤ì íì¼
ìëë¦¬ì¤ 3: “ê°íì ì¤í¨”
ì ê·¼ ë°©ì:
- ì¤í¨ í¨í´ ìë³ (íì´ë°, ë¹ë, ì¡°ê±´)
- ê²½í© ì¡°ê±´(race conditions) íì
- 리ìì¤ ê°ì©ì± íì¸
- ëì ìì ê²í
- ê´ë²ìí ë¡ê¹ ì¶ê°
- ì¬í ìë íì ì¦ê°
ì¼ë°ì ì¸ ìì¸:
- ê²½í© ì¡°ê±´
- ë©ëª¨ë¦¬ ëì
- ì¸ë¶ ìë¹ì¤ ë¶ìì
- ë¤í¸ìí¬ ì´ì
- íì´ë° ìì¡´ ë¡ì§
- 리ìì¤ ê³ ê°
ìëë¦¬ì¤ 4: “ì´ì íê²½ììë§ ìë¬ ë°ì”
ì ê·¼ ë°©ì:
- ì´ì íê²½ ì ì© ì¤ì íì¸
- ì´ì ë°ì´í°ì í¹ì± ê²í
- ì´ì íê²½ì ë¶í/ê·ëª¨ íì¸
- ì´ì íê²½ì ì¢ ìì± ê²í
- ë³´ì/ê¶í ì¤ì ê²í
ì¼ë°ì ì¸ ìì¸:
- ì´ì ë°ì´í°ì ì£ì§ ì¼ì´ì¤
- ê·ëª¨/ë¶í ê´ë ¨ ì´ì
- ì´ì íê²½ ì ì© ì¤ì
- ë¤ë¥¸ ë³´ì ì ì±
- ë°©íë²½ ëë ë¤í¸ìí¬ ì í
- ì´ìì©ì¼ë¡ë§ ì°ëë 기ë¥
ê³ ê¸ ê¸°ë²
Bisect Debugging (Git)
ì´ë¤ 커ë°ì´ ë²ê·¸ë¥¼ ëì íëì§ ì°¾ê¸°:
git bisect start
git bisect bad # íì¬ ë²ì ì ë²ê·¸ê° ìì
git bisect good v1.2.0 # v1.2.0 ë²ì ì ì ìì´ìì
# Gitì´ ì¤ê° 커ë°ì ì²´í¬ììí¨
# í
ì¤í¸ í good/bad ë§í¹
git bisect good/bad
# Gitì´ ë²ì¸ 커ë°ì ìë³í ëê¹ì§ ë°ë³µ
git bisect reset
Heisenbug (ê´ì°°ì í¨ê³¼)
ëë²ê¹ ì ììíë©´ ì¬ë¼ì§ë ìë¬:
ì ëµ:
- ì¤ë¨ì ìì´ ë¡ê¹ ì¶ê°
- ëë²ê¹ ì ìí´ ì´ì í경과 ì ì¬í íê²½ ì¬ì©
- íì´ë° ë° ëìì± ì´ì ê²í
- ì´ê¸°í/íì´ë° ì¢ ìì± íì¸
- ë¹ì¹¨ìµì (non-intrusive) 모ëí°ë§ ì¬ì©
ë©ëª¨ë¦¬ íë¡íì¼ë§ (Memory Profiling)
ë©ëª¨ë¦¬ ëì ë° ì±ë¥ íì¸:
# Python ë©ëª¨ë¦¬ íë¡íì¼ë§
import tracemalloc
tracemalloc.start()
# ... ì½ë ì¤í ...
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
for stat in top_stats[:10]:
print(stat)
ë¤í¸ìí¬ ëë²ê¹ (Network Debugging)
API ë° íµí© ìë¬ íì¸:
ë구:
- ë¸ë¼ì°ì DevTools Network í
- ìì¸ íëê·¸(-v)를 í¬í¨í curl
- API í ì¤í¸ë¥¼ ìí Postman
- í¨í· ì¡°ì¬ë¥¼ ìí Wireshark
- ë¤í¸ìí¬ íë¡ì (Charles, Fiddler)
ì²´í¬ ì¬í:
- Request/response í¤ë
- ìí ì½ë
- Request/response ë°ë
- íì´ë° (ë ì´í´ì, íììì)
- SSL/TLS ì´ì
Quick Reference
TRACE íë ììí¬ íµ ì²´í¬ë¦¬ì¤í¸
â T - TRACE
â ì ì²´ ìë¬ ë©ìì§ ìº¡ì² ìë£
â ì¤í í¸ë ì´ì¤ ìì§ ìë£
â ì¬í ë¨ê³ 문ìí ìë£
â íê²½ ìë³ ìë£
â R - READ
â ìë¬ ì í ìë³ ìë£
â ìë¬ ë©ìì§ ë¶ì ìë£
â ìë¬ ì¹´í
ê³ ë¦¬ ê²°ì ìë£
â ê´ë ¨ ìë¬ íì¸ ìë£
â A - ANALYZE
â ì½ë ê²í ìë£
â ë°ì´í° ì¡°ì¬ ìë£
â íê²½ ê²ì¦ ìë£
â ìí ì¡°ì¬ ìë£
â C - CHECK
â ìë¬ ì²´ì¸ ì¶ì ìë£
â ê°ì¤ í
ì¤í¸ ìë£
â 근본 ìì¸ ìë³ ìë£
â ê°ì ê²ì¦ ìë£
â E - EXECUTE
â ìì ì¤ê³ ìë£
â ìì 구í ìë£
â ìì ê²ì¦ ìë£
â ë°©ì§ ëì±
ì¶ê° ìë£
ìë¬ ì°ì ìì 매í¸ë¦ì¤ (Error Priority Matrix)
ìí¥ë â Low Medium High Critical
ë¹ë â
High Medium High Critical Critical
Medium Low Medium High Critical
Low Low Low Medium High
Rare Backlog Low Medium High
ì¶ê° ìë£
ìì (Examples)
examples/debugging_workflow.md– ë¨ê³ë³ ëë²ê¹ íë¡ì¸ì¤ ììexamples/common_errors.md– ì주 ë°ìíë ìë¬ í¨í´ ë° í´ê²°ì± ì¹´íë¡ê·¸examples/stack_traces.txt– ë¶ìê³¼ í¨ê» ì ê³µëë ì¤í í¸ë ì´ì¤ ìì
ì¤í¬ë¦½í¸ (Scripts)
scripts/debug_helper.py– í¸ë ì´ì¤ íì± ë° ì¸ì ê´ë¦¬ë¥¼ ìí Python ëë²ê¹ ì í¸ë¦¬í°
ì¶ê° íìµ
- ì¸ì´ë³ ëë²ê¹ 문ì
- íë ììí¬ ìë¬ í¸ë¤ë§ ê°ì´ë
- íë¡íì¼ë§ ë° ì±ë¥ ë¶ì ë구
- í ì¤í¸ ë° íì§ ë³´ì¦ ì¤ë¬´
기ìµíì¸ì: ëë²ê¹ ì íì ìì¬ì ëë¤. ì²´ê³ì ì´ê³ ì¸ë´ì¬ì ê°ì§ë©°, ì¦ê±°ê° ì§ì¤ë¡ ë¹ì ì ì¸ëíê² íì¸ì. 모ë ìë¬ ë©ìì§ë ë¹ì ì ì´í´ë¥¼ 기ë¤ë¦¬ê³ ìë ë¨ìì ëë¤.