세그먼테이션 결함이란 무엇입니까?


27

우분투에서는 세그먼테이션 오류 오류가 여러 번 발생했습니다. 세그먼테이션 결함은 무엇이며 언제 발생합니까?


1
그것을 덮기 위해 : 비슷한 문제가 있었지만 segfault는 안정적으로 재현 할 수 없었으며 (거의) 임의 응용 프로그램에서 나왔습니다. 내 기억이 깨졌을 가능성이 가장 높다는 것을 알았습니다. 따라서 프로그램이 segfault를 일으키는 경우 RAM을 자세히 살펴볼 수 있습니다.

답변:


25

오류라고 세그먼트 오류 (또는 세그먼트 폴트 , 또는 SIGSEGV 우분투에서) 유닉스 계열 시스템을 운영, 또는 말을 다른 일반 보호 오류가 프로그램의 시도가 액세스 할 수있는 메모리의 일부, 또는 어떤 프로그램에 액세스 할 때 윈도우에서, 액세스가 금지되어 있습니다. 세그먼트 오류는 일종의 프로그램 충돌, 즉 프로그램의 비정상 종료입니다. 자세한 정보 (여기에 제시된 주제보다 체계적으로 이해 됨)는 크래시 , 메모리 보호 , 세그먼테이션 결함 , 일반 보호 결함SIGSEGV에 대한 Wikipedia 기사를 참조하십시오 .

분할 오류는 거의 항상 프로그램의 버그로 인해 발생합니다. 나는 당신의 세그먼테이션 결함의 대부분 또는 전부가 동일한 응용 프로그램에서 발생하고 있다고 생각합니다. 컴퓨터에서 세그먼트 오류가 발생하는 상황과 충돌하는 프로그램에 대한 자세한 정보를 제공하십시오. 또한 수신되는 오류 메시지와 그 이전에 표시되는 다른 메시지의 전체 내용과 정확한 내용을 알려주십시오. 이를 통해 세그먼테이션 오류에 대한 일반적인 정보가 아닌 문제에 대한 자세한 조언을 제공 할 수 있습니다.

이 정보를 제공하는 가장 좋은 방법은 질문을 편집하여 포함시키는 것 입니다. 또는이 질문이 일반적으로 세그먼테이션 결함에 관한 것이라면, 세그먼테이션 결함의 원인을 구체적으로 묻는 새 질문을 게시 할 수 있습니다 (이를 수행하는 경우 새 질문에이 모든 세부 정보를 제공하십시오) .


운 좋게도 모든 세그멘테이션 오류는 os :)를 업그레이드하여 수정됩니다. 내 질문은 일반적으로 분할 오류에 관한 것입니다. 특정 앱에는 적합하지 않습니다.
Tachyons

@ 나는 그 사람에 따라 대답을 편집하지 않았습니다. (지금 당장은 특별한 도움이 필요하지 않음에도 불구하고 세그먼테이션 오류가 발생하는 다른 사용자의 이익을 위해 더 많은 정보를 제공하는 지침을 유지하고 있습니다.)
Eliah Kagan

이것은 앱의 세그먼테이션 결함에 관한 것입니다. 동일한 프로그램이 Windows 또는 Turbo C ++ (와인)에서 완벽하게 잘 실행되는 것처럼 (Linux에서는 Anjuta를 사용함) C ++ 프로그램에서 발생하는지 묻고 싶었습니다. , GRAPHS 등)
Nirmik

감사합니다. 그러나 앱의 세그먼테이션 오류에 대한 질문은 대부분의 경우 두려워합니다. :)
Tachyons

@Nirmik : 아마 그것은 stackoverflow의 주제 일 것입니다 :)
Tachyons

4

세그먼트 오류는 응용 프로그램의 버그로 인해 발생합니다. 기술적으로 이것은 응용 프로그램이 메모리에 속하지 않거나 존재하지 않는 메모리 부분을 읽거나 쓰려고 함을 의미합니다. 물론 다른 사람의 메모리를 읽거나 쓰는 것은 금지되어 있으며 시스템 (커널)이이를 감지하면 응용 프로그램을 강제 종료합니다.


0

사람들이 어셈블리 코드를 추적하고 문제를 디버깅하는 데 사용하던 시절은 지났습니다. 박사, 왓슨 박사, 세그먼테이션 결함. 그 녹색의 날은지나 갔다.

세그먼테이션 오류의 원인 중 하나는 메모리에 직접 액세스하는 코드가 실패하는 경우입니다. 코드가 다른 응용 프로그램의 메모리 세그먼트에 액세스하려고하면 세그먼트 화 오류가 발생합니다. 더 큰 연속 메모리 블록이 할당 될 수 있도록 메모리 할당이 때때로 이동됩니다. 커널은 복구를 시도하는 동안 모든 메모리 정보를 파일, CPU에서 실행중인 모든 응용 프로그램의 현재 상태 및 해당 상태 (마지막 명령 실행)를 파일에 저장하려고합니다. 또한 많은 복구 정보를 저장하고 가능한 한 많은 파일을 닫아서 hdd가 링크를 끊지 않도록 시도합니다.

자주 재현 할 수 있으면 디버깅하고 수정하십시오. 그것을 재현 할 수 없다면, 손을 잡고 무릎을 꿇고 "일반적으로"보이지 않는 지옥처럼기도하십시오.


Segfault는 메모리에 직접 액세스 할 수있는 언어로 작성된 모든 프로그램에서 트리거 될 수 있습니다. 그들은 일반적으로 커널을 충돌시키지 않습니다.
Alex L.

@AlexL. 정확합니다. 답변을 편집하겠습니다.
Siddharth

내 생각을 올바르게 표현했으면 좋겠다.
Siddharth

@AlexL. 한 번 더 검토해 주시겠습니까? 여전히 정확하지 않으면 삭제하겠습니다.
Siddharth

이게 낫다. 프로그램이 설정에 대해 여전히, (1)은 가능하지만 그것은 매우 드문 SIGSEGV이외의 다른 핸들러 SIG_DFL(A의 핵심 종료 덤프입니다 SIGSEGV당신이 무언가 아주 간 안하는 메모리에 액세스하는 경우 이후) 잘못하고 회복은 불가능할 것입니다. (2) 프로세스가 중지 된 후에 만 ​​코어가 덤프됩니다. (3) 코어 덤프에는 덤프 된 프로세스의 메모리와 레지스터 만 포함됩니다. (4) 다른 프로세스, CPU 및 커널은 다른 프로세스의 segfault의 영향을받지 않습니다.
Alex L.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.