Study: ComputerScience(CS)/CS: Linux

[Linux] gdb ν™œμš©ν•˜λŠ” λ‹€μ–‘ν•œ 방법: executable, process, core dump file

DrawingProcess 2022. 12. 28. 15:11
λ°˜μ‘ν˜•
πŸ’‘ λ³Έ λ¬Έμ„œλŠ” 'gdb ν™œμš©ν•˜λŠ” λ‹€μ–‘ν•œ λ°©λ²•'에 λŒ€ν•΄ 정리해놓은 κΈ€μž…λ‹ˆλ‹€.
C / C++ μ½”λ“œλ₯Ό 디버깅 툴 쀑 κ°€μž₯ 유λͺ…ν•œ gdb와 이λ₯Ό μ‚¬μš©ν•΄μ•Όν•  λ•Œμ— λŒ€ν•΄ μ •λ¦¬ν•˜μ˜€μœΌλ‹ˆ μ°Έκ³ ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€. μΆ”κ°€λ‘œ ν•˜κΈ°μ— μž‘μ„±ν•œ 링크λ₯Ό 톡해 이λ₯Ό ν™œμš©ν•˜μ—¬ executable, process, core dump file을 λ””λ²„κΉ…ν•˜μ—¬ λΆ„μ„ν•˜λŠ” 방법에 λŒ€ν•œ 글도 λ§ν¬ν•˜μ˜€μœΌλ‹ˆ μ°Έκ³ ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

1. GDBλž€?

쒋은 λ””λ²„κ±°λŠ” 문제λ₯Ό ν•΄κ²°ν•˜κ³ , ν”„λ‘œκ·Έλž¨μ„ μ’€ 더 μ‰½κ²Œ κ°œλ°œν•˜κ³  리버싱을 ν•˜λŠ” λ“± λ‹€μ–‘ν•œ λ°©μ•ˆμ—μ„œ κ°œλ°œμžμ—κ²Œ 도움을 μ£ΌλŠ” 도ꡬ μž…λ‹ˆλ‹€. λ§Žμ€ ν”Œλž«νΌμ—μ„œ 그에 맞좰 쒋은 디버거듀이 μ‘΄μž¬ν•˜κ³  κ°œλ°œμžλ“€μ€ μžμ‹ μ—κ²Œ λ§žλŠ” 디버거λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έ 쀑 GDB(The GNU Debugger)λŠ” λ§Žμ€ ν”Œλž«νΌ, x86, x86-64, arm, aarch64, mips, SPARCλ“± λ‹€μ–‘ν•œ μ•„ν‚€ν…μ²˜ μ—μ„œ λ™μž‘ν•˜λŠ” UNIX μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λ””λ²„κ±°λ‘œ, C / C++ 둜 μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. μ–Έμž¬ GDB μ‚¬μš©?

처음 GDBλ₯Ό κ³΅λΆ€ν•˜μ‹œλŠ” 뢄듀이 많이 μ–΄λ €μ›Œ ν•˜μ‹œλŠ”κ²Œ μ–Έμ œ GDBλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€ μž…λ‹ˆλ‹€. λ””λ²„κ±°λŠ” μ—¬λŸ¬λΆ„λ“€μ΄ μž‘μ„±ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ λ°œμƒν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•˜λŠ”λ° 맀우 도움을 μ£Όμ§€λ§Œ μ œλŒ€λ‘œ ν™œμš©ν•˜μ§€ λͺ»ν•œλ‹€λ©΄ μ•„λ¬΄λŸ° μ“Έλͺ¨κ°€ μ—†μ–΄μ§ˆν…Œλ‹ˆ κ°„λ‹¨ν•˜κ²Œλ‚˜λ§ˆ μ–Έμ œ μ‚¬μš©ν•˜λ©΄ 쒋을 지 μ •λ¦¬ν•΄λ³΄κ³ μž ν•©λ‹ˆλ‹€.

  • νŠΉμ • μ‹œμ , ν¬μΈνŠΈμ—μ„œ 디버깅 : λ””λ²„κΉ…ν•˜κΈΈ μ›ν•˜λŠ” μ‹œμ (νŠΉμ • ν•¨μˆ˜ λ˜λŠ” 쑰건)μ—μ„œ μ—¬λŸ¬λΆ„λ“€μ΄ μ›ν•˜λŠ” λͺ¨λ“  정보λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ¬Έμ œκ°€ μ‰½κ²Œ μž¬ν˜„λ¨ : 이슈 ν•΄κ²° μ‹œ μ‰½κ²Œ μž¬ν˜„λ˜λŠ” 것 만큼 쒋은 건 μ—†μŠ΅λ‹ˆλ‹€. GDBλ₯Ό μ΄μš©ν•˜λ©΄ κ·Έ μ‹œμ μ—μ„œ 문제의 원인을 λ”μš± λΉ λ₯΄κ³  μ‰½κ²Œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 문제 상황이 μ˜ˆμΈ‘ν•  수 μžˆμ„ λ•Œ : μ—¬λŸ¬λΆ„λ“€μ΄ λ¬Έμ œκ°€ λ˜λŠ” 상황을 μ•ˆλ‹€λ©΄, breakpointλ₯Ό μ΄μš©ν•΄μ„œ λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” 상황에 λŒ€ν•΄ 디버깅 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 외에도 λ‹€μ–‘ν•œ λ¬Έμ œμ—μ„œ μ‚¬μš©κ°€λŠ₯ν•©λ‹ˆλ‹€. μ—¬λŸ¬κ°€μ§€ κΈ°λŠ₯듀을 μ—¬λŸ¬ μ˜ˆμ‹œλ₯Ό 톡해 μ„€λͺ…ν•˜λ©° 이해할 수 μžˆλ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.
gdbλ₯Ό μ΄μš©ν•΄ 디버깅 ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. 그럼 μ–΄λ–»κ²Œ μ—¬λŸ¬λΆ„λ“€μ˜ ν”„λ‘œκ·Έλž¨μ— gdbλ₯Ό μ μš©ν•  수 μžˆλŠ”μ§€ μ‚΄νŽ΄λ³΄μ£ . ν”„λ‘œκ·Έλž¨μ— gdbλ₯Ό μ΄μš©ν•˜λŠ” 방법은 3가지 μž…λ‹ˆλ‹€.

  • gdbλ₯Ό μ΄μš©ν•΄μ„œ 직접 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜μž
  • 싀행쀑인 ν”„λ‘œκ·Έλž¨μ— gdbλ₯Ό λΆ™μ—¬ μ‚¬μš©ν•˜μž
  • core file을 μ‚¬μš©ν•΄μ„œ λΆ„μ„ν•˜μž

μœ„ λ‚΄μš©μ„ μ•„λž˜μ²˜λŸΌ ν‘œν˜„ν•  μˆ˜ μžˆμ„ κ²ƒ κ°™μŠ΅λ‹ˆλ‹€.

gdbλ₯Ό run, attach, load의 방식을 톡해 뢄석이 κ°€λŠ”ν•˜λ©° 직접 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©° λΆ„μ„ν•˜λŠ” 2가지 방법과 사후 λ€ν”„νŒŒμΌ(core file)을 μ΄μš©ν•œ 방법도 μžˆμŠ΅λ‹ˆλ‹€. load 방식은 개발 ν›„ 검증 λ˜λŠ” 릴리즈 ν›„ λ°œμƒν•˜λŠ” 문제λ₯Ό report 받을 λ•Œ μ‚¬μš©ν•˜λ©΄ 직접 문제λ₯Ό μž¬ν˜„ν•΄λ³΄μ§€ μ•Šμ•„λ„ 문제의 원인을 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ¨Όμ € run 방식과 attach 방식을 톡해 gdb의 κΈ°λŠ₯듀을 μ‚΄νŽ΄λ³΄κ³ , μΆ”ν›„ load 방식에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

3. 마무리

λ³Έ ν¬μŠ€νŒ…μ—μ„œλŠ” GDBλ₯Ό μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œλŠ” 각각의 μ‚¬μš©ν•˜λŠ” 방법 별 μ„ΈλΆ€ μ˜ˆμ‹œλ₯Ό λ“€μ–΄ μ„€λͺ…ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

μ°Έκ³ 

λ°˜μ‘ν˜•