C 프로그래밍 언어를 알아야 하고 운영 체제가 어떻게 작동하는지 더 깊이 이해해야 하지만, 프로그래밍 언어, 쉘 스크립팅 및 명령줄에 대한 기본적인 이해가 있는 사람이라면 이 정도 가치가 있을까요? 커널에 대한 지식이 있나요? 능력이 부족한 사람도 혜택을 받을 수 있나요?
답변1
Linux 사용자로서 저는 스스로에게 이런 질문을 해왔습니다.
가장 먼저 떠오르는 것은 strace
(매뉴얼 페이지).
커널의 다양한 부분을 이해하면 strace의 출력을 해석하고 일반 로그에서 코드를 추가로 디버그하는 방법에 대한 통찰력을 얻을 수 있습니다.
예를 들어, 다음은 문장을 포함하는 strace cat text.txt
의 출력입니다 .text.txt
my name is test
execve("/usr/bin/cat", ["cat", "test.txt"], [/* 76 vars */]) = 0
brk(0) = 0x1e4f000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1b8ecd4000
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=138212, ...}) = 0
mmap(NULL, 138212, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1b8ecb2000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2118128, ...}) = 0
mmap(NULL, 3932672, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1b8e6f5000
mprotect(0x7f1b8e8ab000, 2097152, PROT_NONE) = 0
mmap(0x7f1b8eaab000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7f1b8eaab000
mmap(0x7f1b8eab1000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1b8eab1000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1b8ecb1000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1b8ecaf000
arch_prctl(ARCH_SET_FS, 0x7f1b8ecaf740) = 0
mprotect(0x7f1b8eaab000, 16384, PROT_READ) = 0
mprotect(0x60b000, 4096, PROT_READ) = 0
mprotect(0x7f1b8ecd5000, 4096, PROT_READ) = 0
munmap(0x7f1b8ecb2000, 138212) = 0
brk(0) = 0x1e4f000
brk(0x1e70000) = 0x1e70000
brk(0) = 0x1e70000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=106070960, ...}) = 0
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1b881cc000
close(3) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("test.txt", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=16, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "my name is test\n", 65536) = 16
write(1, "my name is test\n", 16my name is test
) = 16
read(3, "", 65536) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
모두시스템 호출위에서 볼 수 있으므로 커널에 대한 지식이 있으면 코드를 디버깅할 때 더 많은 단서를 얻을 수 있습니다.
답변2
이것어떤 경우에는 커널 유형, 아키텍처, 모듈 및 호환성에 대해 아는 것이 도움이 될 수 있습니다.