κ°μ π
νμμκ²λ λλ²κΉ μ΄ νμ μμ κ°μ₯ λ§μ μκ°μ μλͺ¨νλ μΌμ΄λ€. μ 무 ν¨μ¨μ μν΄μ λλ²κΉ νλ λ°©λ²μ μ°Ύλ λμ€ μ»€λμμ μ 곡νλ kdbμ kgdbλ₯Ό μ΄μ©νλ λ°©λ²μ λν μΈλ―Έλλ₯Ό λ³΄κ² λμλ€. μ ν¬λΈμμ Β«Using Serial kdb / kgdb to Debug the Linux Kernel - Douglas Anderson, GoogleΒ» κ²μν μμμΈλ°, KDBμ KGDB νμ©νλ λ°©λ²μ λν΄ μμΈνκ² μ€λͺ νκ³ μλ€. λ³Έ ν¬μ€ν μμλ λ§ν¬μ μμμ ν μ€νΈ νκΈ° μν΄ νμν λλ²κΉ νκ²½ κ΅¬μ± λ°©λ²μ λν΄μλ§ κ°λ¨νκ² μ 리νλ€.
KDB/KGDB λ₯Ό μ΄μ©νλ λ°©λ²μ Trace32 λ₯Ό μ΄μ©νμ¬ λλ²κΉ ν μ μλ νκ²½μμ λ§€μ° μ μ©νλ€. νκ² λ³΄λμ λ°λΌ JTAG λλ²κΉ ν¬νΈκ° λμμμ§ μμ κ²½μ°λ κ½€ μκΈ° λλ¬Έμ΄λ€. ν κ°μ§ λ¨μ μΌλ‘λ λλ²κΉ νκ²½ ꡬμ±μ΄ μκ°λ³΄λ€ 볡μ‘νλ€.
νκ²½ ꡬμ±μ μν΄ νμν μμ μ μλμ κ°λ€.
- De-muxing Serial communication (kdmx)
- Kernel configuration
- Attaching GDB
Demuxing Serial Communication using kdmx π
νμλ λΌμ¦λ² 리νμ΄λ₯Ό μ΄μ©νμ¬ λλ²κΉ νκ²½μ ꡬμ±νλ€. νΈμ€νΈκ° 리λ μ€ λ©νμ΄μμΌλ©΄ μ’μκ² μ§λ§, μνκΉκ²λ λ§₯ OS νκ²½μ μ¬μ©νμλ€. νκ² λ³΄λμ μλ¦¬μΌ ν΅μ μ νλ€λ κ°μ νμ, GDBμ ν°λ―Έλ νκ²½μ νλμ μλ¦¬μΌ ν¬νΈλ‘ μ°κ²°νκΈ° μν΄μλ κ°μ μλ¦¬μΌ ν¬νΈλ₯Ό μμ±νκ³ ν΅μ μ De-mux ν΄μ£Όλ νλ‘κ·Έλ¨μ΄ νμνλ€. κ·Έλ¦¬κ³ μ΄λ₯Ό μν κ°λ¨ν λκ΅¬κ° kdmxμ΄λ€. λ³Έλ agent-proxy λΌλ νλ‘μ νΈ λ°μ κ°λ¨ν νλ‘κ·Έλ¨ ννλ‘ λ€μ΄κ° μμ§λ§, μμ½κ² λ°μμ λ³λμ νκ²½ λ³μ μ€μ μμ΄ κ³§λ°λ‘ λΉλκ° κ°λ₯νλ€.
ioctlμ μ¬μ©νμ§ μλ BSD κ³μ΄μμλ μ½κ°μ μμ μ¬νμ΄ νμνμ§λ§ νμκ° μ¬λ €λμ μ μ₯μ λ΄μ μ½λ(https://github.com/seokbeomKim/kdmx)λ₯Ό μ΄μ©νλ©΄ λλ€. 리λ μ€ κ³μ΄μ΄λΌλ©΄, git://git.kernel.org/pub/scm/utils/kernel/kgdb/agent-proxy.git μμ λ€μ΄λ°μμ μ¬μ©νλλ‘ νμ.
kdmx λ₯Ό λΉλν λ€μ μλμ κ°μ΄ μ€νν΄μ£Όλ©΄, pseudo ttyκ° λ§λ€μ΄μ§ κ²μ νμΈν μ μλ€.
ν μ€νΈλ₯Ό μν΄ /dev/ttys000 λ₯Ό μ΄μ΄ μλμ κ°μ΄ νμΈν΄λ³΄μ.
Kernel Configuration π
μλμ 컀λ μ€μ νλκ·Έλ€μ νμΈνλ€. 컀λ μ»΄νμΌ νλ λ°©λ²μ λλ²κΉ νκ²½ ꡬμ±κ³Ό λ€λ₯Έ λ΄μ©μ΄λ―λ‘ μ΄ ν¬μ€ν μμ μμΈνκ² μ€λͺ νμ§ μκ² λ€.
|
|
Attaching GDB π
μ΄μ KGDBλ₯Ό μ§μ μ΄μ©ν΄λ³΄μ. νμλ μ»΄νμΌμ© 리λ μ€ μλ²μμ 컀λμ λΉλνκ³ μμ±λ vmlinux νμΌμ Mac OSμ 볡μ¬νμ¬ μ¬λ³Όμ λ‘λνλλ° μ¬μ©νμλ€. λ§₯μ© gdbκ° νμνλ€λ©΄ λ°λμ https://seokbeomkim.github.io/posts/kernel-hacking-on-mac/ ν¬μ€ν μ μ°Έκ³ νλλ‘ νλ€. (homebrew λ₯Ό μ΄μ©νμ¬ gdb λ₯Ό μ€μΉν΄λ΄€μ μ μμ μΌλ‘ λμνμ§ μμΌλ λ°λμ ν¬μ€ν μ κΈ°μ λλλ‘ μ§μ GDBλ₯Ό λΉλν΄ μ¬μ©ν΄μΌ νλ€.) μ°λΆν¬μ κ°μ λ°λΉμ κ³μ΄μ΄λΌλ©΄ gdb-multiarchλ₯Ό, μμΉλ¦¬λ μ€λΌλ©΄ AUR λ΄μ μλ μ»΄νμΌλ¬ ν¨ν€μ§λ€μ μ΄μ©νμ.
λ¨Όμ , kdmx λ₯Ό μ΄μ©νμ¬ μλ¦¬μΌ ν΅μ μ΄ μ λλ‘ demuxing λκ³ μλ€λ κ°μ νμ μ§ννλ€. λ¨μνκ² kgdbμ λμμ ν μ€νΈν λͺ©μ μ΄λ―λ‘, sysrq λ₯Ό μ΄μ©νμ¬ kdbμ μ§μ νμ¬ kgdbλ₯Ό λΆμΈ λ€ κ³ μλ‘ μ»€λ ν¨λμ λ°μμμΌ gdbλ‘ μ΄λ»κ² λΆμ κ°λ₯νμ§λ₯Ό λ³΄μΌ κ²μ΄λ€.
λ¨Όμ , kgdb μμ μ¬μ©ν μ리μΌμ μλμ κ°μ΄ μ€μ ν΄μ€λ€.
μ΄μ sysrq λ₯Ό μ΄μ©νμ¬ KDBλ‘ μ§μ ν λ€ kgdb λ₯Ό μ€ννλ€.
μ΄μ νΈμ€νΈμμ GDBλ₯Ό μ€νν λ€ μλ¦¬μΌ ν΅μ μΌλ‘ λΆμ¬μ€λ€. μλμ κ°μ΄ μ μμ μΌλ‘ attach κ° λ κ²μ μ μ μλ€.
|
|
λλ§Ίμ π
νμ μμ λ€λ₯Έ μ¬λλ€μ λλ²κΉ λ°©λ²μ 보면μ κ°μ₯ λ΅λ΅ν λΆλΆμ λλ²κΉ μμ ν΄μ μ¬μ©νμ§ μλλ€λ μ μ΄λ€. λͺλͺ μ€ν κ°λ°μμ κ²½μ° λλ²κΉ ν΄μ μ«μ΄νκ³ λ‘κ·Έ λ©μμ§λ§μΌλ‘λ μΆ©λΆνλ€κ³ νλλ° κ°μΈμ μΌλ‘λ μ΄λ¬ν μ견μ λ°λνλ€. λ‘κ·Έ λ©μμ§λ₯Ό μ΄μ©νμ¬ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©ν₯μ μΈμ°κ³ λΆμνλ κ²λ μ€μνμ§λ§, κ·Έλ¬ν λ¬Έμ ν΄κ²°μ λμμ μ£Όλ λꡬλ₯Ό μ΄μ©νμ¬ λΆνμν μκ°μ μ€μ΄λ κ²λ μ€μνλ€. λ¬Όλ‘ , κ·Έλ€μ²λΌ λλνμ§ μμ κ²λ μ€μν μ΄μ λ€.