gdb 및/또는 (실제 대상에 디버거가 설치되어 있지 않기 때문에)을 coredumpctl info
사용하지 않고 호출 스택을 가져올 수 있도록 coredump를 사용하여 인쇄할 때 systemd에 함수 이름이 포함된 호출 스택을 포함하도록 설정하려고 합니다 . coredumpctl debug
그래서 그냥 사용하고 싶습니다 coredumpctl info
.
Fedora 39를 사용하여 패키지를 설치 하고 tftp-server
tftpd(systemctl start tftp)를 시작하고 프로세스에 전송하여 kill -SEGV
코어 덤프를 테스트했습니다 /usr/sbin/in.tftpd
. 그런 다음 이런 방식으로 생성된 코어 덤프에는 프로세스 내의 함수 이름이 포함되어 있음을 확인했습니다 in.tftpd
(Fedora는 minidebuginfo
기본적으로 /를 활성화합니다).gnu_debugdata
그러나 디버그 기호로 컴파일된 테스트 C 파일로 동일한 작업을 수행하면 테스트 코어 덤프에 n/a
내 프로세스의 함수 이름이 표시됩니다(전체 디버그 기호와 minidebuginfo
/ 만 사용하여 시도했습니다 gnu_debugdata
).
Fedora 패키지로 설치된 바이너리의 경우처럼 내 응용 프로그램도 올바른 코어 덤프를 생성하려면 어떻게 해야 합니까?
테스트 코드(파일
test.c
):#include <stdio.h> #include <unistd.h> int test123() { printf("test123\n"); sleep(1); } int main() { for (;;) { test123(); } }
테스트 빌드 파일:
all: gcc ./test.c -o test-with-symbols -g
coredumpctl info
Fedora에서는 괜찮아 보입니다(in.tftpd
함수 이름이 표시됩니다):main
in.tftpd
$ coredumpctl info 4335 PID: 4335 (in.tftpd) UID: 0 (root) GID: 0 (root) Signal: 11 (SEGV) Timestamp: Mon 2023-11-20 06:07:08 EST (1h 36min ago) Command Line: /usr/sbin/in.tftpd -s /var/lib/tftpboot Executable: /usr/sbin/in.tftpd Control Group: /system.slice/tftp.service Unit: tftp.service Slice: system.slice Boot ID: 954e4f02e86e4f6498987e2e202d0413 Machine ID: 28dd14ccbe5b46018201dd25d5a60e94 Hostname: localhost-live Storage: /var/lib/systemd/coredump/core.in\x2etftpd.0.954e4f02e86e4f6498987e2e202d0413.4335.1700478428000000.zst (missing) Package: tftp/5.2-41.fc39 build-id: 438daef3ffb345cc3c791def1ceba465865929f6 Message: Process 4335 (in.tftpd) of user 0 dumped core. Module in.tftpd from rpm tftp-5.2-41.fc39.x86_64 Stack trace of thread 4335: #0 0x00007ffb2640ef8e __select (libc.so.6 + 0x112f8e) #1 0x00005578d0fde699 main (in.tftpd + 0x4699) #2 0x00007ffb2632414a __libc_start_call_main (libc.so.6 + 0x2814a) #3 0x00007ffb2632420b __libc_start_main@@GLIBC_2.34 (libc.so.6 + 0x2820b) #4 0x00005578d0fdfa15 _start (in.tftpd + 0x5a15) ELF object binary architecture: AMD x86-64
codedumpctl info
내 테스트 바이너리는n/a
함수 이름 대신에 이를 보여줍니다. 저는 이것을 Fedora 39와 Ubuntu 22.04(Fedora 39의 systemd 버전 254, Ubuntu 22.04의 systemd 버전 249)에서 테스트했습니다.liveuser@localhost-live:~/Downloads/test$ coredumpctl info 8485 PID: 8485 (test) UID: 1000 (liveuser) GID: 1000 (liveuser) Signal: 11 (SEGV) Timestamp: Mon 2023-11-20 07:26:38 EST (54s ago) Command Line: ./test Executable: /home/liveuser/Downloads/test/test Control Group: /user.slice/user-1000.slice/[email protected]/app.slice/app-org.gnome.Terminal.slice/vte-spawn-07143dc2-3f50-4778-a60f-e027a4bb85e9.scope Unit: [email protected] User Unit: vte-spawn-07143dc2-3f50-4778-a60f-e027a4bb85e9.scope Slice: user-1000.slice Owner UID: 1000 (liveuser) Boot ID: 954e4f02e86e4f6498987e2e202d0413 Machine ID: 28dd14ccbe5b46018201dd25d5a60e94 Hostname: localhost-live Storage: /var/lib/systemd/coredump/core.test.1000.954e4f02e86e4f6498987e2e202d0413.8485.1700483198000000.zst (present) Size on Disk: 17.9K Message: Process 8485 (test) of user 1000 dumped core. Stack trace of thread 8485: #0 0x00007f8a5b4bd127 clock_nanosleep@GLIBC_2.2.5 (libc.so.6 + 0xd9127) #1 0x00007f8a5b4cf9f7 __nanosleep (libc.so.6 + 0xeb9f7) #2 0x00007f8a5b4e1333 sleep (libc.so.6 + 0xfd333) #3 0x0000558c6c9a118a n/a (/home/liveuser/Downloads/test/test + 0x118a) #4 0x0000558c6c9a119f n/a (/home/liveuser/Downloads/test/test + 0x119f) #5 0x00007f8a5b40c14a __libc_start_call_main (libc.so.6 + 0x2814a) #6 0x00007f8a5b40c20b __libc_start_main@@GLIBC_2.34 (libc.so.6 + 0x2820b) #7 0x0000558c6c9a10a5 n/a (/home/liveuser/Downloads/test/test + 0x10a5) ELF object binary architecture: AMD x86-64