내 프로그램이 Ubuntu 18.04에서 잠시 실행된 후 충돌이 발생했습니다. 마지막 몇 줄은 strace
다음과 같습니다.
6260 openat(AT_FDCWD, "/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale-langpack/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale-langpack/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale-langpack/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale-langpack/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 openat(AT_FDCWD, "/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
6260 write(2, "terminate called after throwing "..., 48) = 48
6260 write(2, "std::system_error", 17) = 17
6260 write(2, "'\n", 2) = 2
6260 write(2, " what(): ", 11) = 11
6260 write(2, "Unknown error -1", 16) = 16
6260 write(2, "\n", 1) = 1
6260 rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
6260 rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
6260 getpid() = 6260
6260 gettid() = 6260
6260 tgkill(6260, 6260, SIGABRT) = 0
6260 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
6260 --- SIGABRT {si_signo=SIGABRT, si_code=SI_TKILL, si_pid=6260, si_uid=1000} ---
6260 +++ killed by SIGABRT (core dumped) +++
위의 메시지에 대한 나의 이해는 libc.mo
찾을 수 없다는 것입니다. 내 이해가 맞나요? 그렇다면 어떻게 해결할 수 있습니까? 그렇지 않은 경우 누군가 충돌 원인을 감지하는 방법에 대한 조언을 제공할 수 있습니까?
답변1
strace 출력에서 프로그램이 file 을 검색하고 있음을 알 수 있지만 libc.mo
여기서는 이것이 문제가 아닙니다. 파일 .mo
에는 번역이 포함되어 있으며 찾을 수 없는 경우 메시지는 일반적으로 영어로 표시됩니다. 경로명을 보면 로케일이 인 것 같으 en_US
므로 번역이 필요하지 않습니다.
이 문제에 대한 팁은 다음과 같습니다.
6260 write(2, "terminate called after throwing "..., 48) = 48
6260 write(2, "Unknown error -1", 16) = 16
"던지기"(또는 그 이상) 후에 잘린 메시지를 표시하려면 더 큰 크기를 사용하십시오 -s 50
. 예외 클래스 이름이 포함될 수 있습니다. 또 다른 팁은 일반적으로 도움이 되지 않는 "알 수 없는 오류 -1"입니다.
단순한 프로그램이 아니라 여러분의 프로그램이라면 디버거에서 실행하세요. 추적과 더 유용한 정보를 얻을 수 있습니다.