Pintos ๊ณผ์ ์ด ๋ง๋ฌด๋ฆฌ ๋์๋ค.
์งํํ๋ฉด์ ํฐ ๋์์ ๋ฐ์๋ debug ๋ฐฉ๋ฒ์ ๋ํด์ ๊ณต์ ํด๋ณด๊ณ ์ ํ๋ค.
0-1. pintos-kaist ํ๋ก์ ํธ ์งํ์ ์ํ EC2 ์ด๊ธฐ setting์ด ์๋ฃ ๋์ด์์ด์ผ ํ๋ค.
$ sudo apt update
$ sudo apt install -y gcc make qemu-system-x86 python3
$ sudo apt install -y gdb
0-2. VSCode์์ open folder > pintos-kaist
๋ฅผ ํตํด ํ์ฌ window์ ์ต์์ ๋๋ ํ ๋ฆฌ๋ฅผ pintos-kaist
๋ก ๋ง๋ ํ, ์๋์ ๊ณผ์ ์ ์งํํด์ผ ํ๋ค.
Native Debug
extension์ ์ค์นํ๋ค.pintos ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ .vscode
๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
.vscode
๋๋ ํ ๋ฆฌ ์์ launch.json
ํ์ผ์ ์์ฑํ๊ณ ์๋์ ๋ด์ฉ์ ๋ถ์ฌ๋ฃ๋๋ค.
ํ๋ก์ ํธ ๋ณ๋ก executable
์ value๋ฅผ ์กฐ์ ํด์ฃผ์ด์ผ ํ๋ค.
e.g. project2: user programs ์ ๋ํ์ฌ,
"executable": "${workspaceRoot}/userprog/build/kernel.o"
{
"configurations": [
{
"type": "gdb",
"request": "attach",
"name": "Attach to gdbserver : threads",
"executable": "${workspaceRoot}/threads/build/kernel.o",
"target": "localhost:1234",
"remote": true,
"cwd": "${workspaceRoot}",
"valuesFormatting": "parseText"
}
]
}
ํ์ฌ ์งํ ์ค์ธ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ (e.g. pintos-kaist/threads/
) ์ pintos๋ฅผ build ํ๋ค. (make
)
debug ํ๊ณ ์ถ์ .c ํ์ผ์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ๋ฅผ ์ค์ ํ๋ค.
ํด๋น ํ๋ก์ ํธ์ build ๋๋ ํ ๋ฆฌ ์์์ pintos ํ
์คํธ๋ฅผ ์ง์ ์คํํ๋ค. script commands์ --gdb
๋ฅผ ๋ฐ๋์ ํฌํจ์์ผ์ผ ํ๋ค. (e.g. pintos --gdb -- -q run alarm-multiple
).
๊ทธ๋ฌ๋ฉด qemu๋ ํฐ๋ฏธ๋์ ๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ ๋ฑ์ผ๋ฉด์, ์ฐ๋ฆฌ๊ฐ ์คํํ gdb๊ฐ ์ฐ๊ฒฐ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ ค์ค๋ค.
qemu-system-x86_64: warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5]
VScode ๋งจ ์ผ์ชฝ์ "Run and Debug" ํญ์ ๊ฐ์ Attach to gdbserver configuration์ผ๋ก debug๋ฅผ ์คํํ๋ค.
์ต๊ณ ์ ๊ทผ๋ณธ debug.
๋ชจ๋ฅด๊ฒ ์ผ๋ฉด ๋ค ์ฐ์ด๋ณด๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ค. ํด๋น ํจ์๊ฐ ํธ์ถ๋๋์ง ๋ํ ๊ทธ ํจ์ ์์์ ์๋ฌด ์ถ๋ ฅ์ด๋ ํด๋ณด๋ฉด์ ํ์ธํ ์ ์๋ค. (e.g. printf("์ฌ๊ธฐ ์ค๋...?");
)
์์ ์๊ฐ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์์๋ ์ธ๊ฐ์ธ ์ฐ๋ฆฌ๊ฐ ์ง์ ๋ณ์๋ค์ ๊ฐ์ ํ์ธํ๋ฉด์ ์ค๋ฅ๋ฅผ ์ฐพ๋๋ค.
ASSERT()
๋งคํฌ๋ก๋ ๊ทธ ํ์ธ๊น์ง ์ปดํจํฐ์๊ฒ ์์ผ๋ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ์ด๋ค. ๊ฐ๊ณผํ๊ธฐ ์ฝ์ง๋ง ์ ์๊ฐํด๋ณด๋ฉด ์ด๋ ๊ฒ ํ์ง ์์ ์ด์ ๊ฐ ์๋ค. (๋ด๊ฐ ์ง์ ํ์ธํ ์ด์ ๊ฐ ์๋ค.)
ASSERT()
์ ์ธ์๋ก ๋ค์ด๊ฐ๋ ์์ด true ์ผ ๋๋ง ํด๋น ASSERT()
๋ฅผ ํต๊ณผํ ์ ์๋ค. ๋ง์ฝ ๊ทธ ๊ฐ์ด false๋ผ๋ฉด ์ปค๋์ PANIC์ ๋น ์ง๋ค. PANIC ๋ฉ์ธ์ง์๋ ๊ฒ์ฌ์, ์คํ๋ ํ์ผ, ๋ผ์ธ ๋ฒํธ, backtrace๊ฐ ํฌํจ๋๋ค. ์ด๋ฏธ skeleton code์ ๋ง์ ASSERT()
๊ฐ ์์ฑ๋์ด ์๋ค. ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ์ฝ๋์์๋ ASSERT()
๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด ์ค์๋ฅผ ์ค์ด๊ณ debug๋ฅผ ์ฉ์ดํ๊ฒ ํ ์ ์๋ค.
C/C++ compiler๋ NULL Pointer Exception ๊ฐ์ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ฃผ์ง ์๋๋ค. ๋ฐ๋ผ์ NULL ํฌ์ธํฐ๋ฅผ ๋ฐ๊ฒฌํ์ง ๋ชปํ ๊ฒฝ์ฐ ํด๋น ํฌ์ธํฐ ์ฌ์ฉ์์ ๋งค์ฐ ์ด์ํ ์ฃผ์(e.g. 0x600)๋ก Page fault๊ฐ ๋ฐ์ํ๋ฉด์ kernel์ด ์ฃฝ๋๋ค. ๊ฐ์ด์ด ๋ต๋ตํด์ง๊ณ ์ ์ ์ด ์๋ํด์ง๋ ์ด๋ฌํ ์ํฉ์, ASSERT()
๋ฅผ ํ์ฉํด ์ต๋ํ ํผํ ์ ์๋ค.
์๋ฅผ ๋ค๋ฉด, ์ด๋ค ํจ์ ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๊ณ ํ ๋, ์ธ์๋ก ๋ฐ์ ๋ณ์๊ฐ ๋น์ฐํ ์ง์ผ์ผํ ์์ฑ๋ค์ ํจ์์ ์ฝ๋๊ฐ ์์ํ๊ธฐ ์ ASSERT()
๋ฅผ ํตํด ํ์ธํด๋ณผ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ค๋ฅ์ ์์ธ์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๊ธฐ๊ฐ ๋งค์ฐ ์ฉ์ดํด์ง๋ค. ASSERT()
์ ์ฌ์ฉ๋ ์์ด ์ด๋ค ์ด์ ๋ก ์ฐธ์ด ๋์ง ๋ชปํ๋์ง๋ฅผ ๊ณ์ ๊ณ ๋ฏผํ๋ค๋ณด๋ฉด ์์ธ์ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฑดํฌ๋ฅผ ๋น๋ค.
์ต๊ณ ์์!