저는 현재 계통발생적 ANOVA를 수행하는 통계 모델링 스크립트를 실행하고 있습니다. 전체 데이터 세트를 분석하면 스크립트가 제대로 작동합니다. 그러나 하위 집합을 얻으면 구문 분석이 시작되지만 곧 분할 오류로 인해 종료됩니다. 이것이 내 측의 문제(예: 분석에 사용된 샘플 데이터 세트가 너무 작음) 및/또는 스크립트의 버그로 인한 것인지 아니면 이것이 내 문제와 관련이 있는지 인터넷 검색으로는 실제로 알아낼 수 없습니다. 리눅스 시스템. 메모리에 데이터를 쓰는 것과 관련이 있다고 읽었는데, 더 큰 데이터 세트를 사용하면 모든 것이 괜찮은 이유는 무엇입니까? 더 많은 정보를 찾기 위해 Google을 사용해 보았지만 상황이 더 복잡해졌습니다.
미리 설명해 주셔서 감사합니다!
답변1
(TL;DR: 이것은 거의 확실하게 프로그램이나 프로그램이 사용하는 라이브러리의 버그입니다.)
분할 오류는 불법적인 메모리 액세스를 나타냅니다. 즉, 요청한 페이지가 상주하지 않거나 요청과 일치하지 않는 권한을 갖고 있기 때문에 요청에 따라 CPU가 페이지 오류를 발생시킵니다.
그 후, 커널은 해당 페이지에 대해 전혀 아는 것이 없는지, 이미 메모리에 없어 거기에 넣어야 하는지, 또는 일부 특수 처리(예: 페이지를 읽은 후 복사-쓰기)를 수행해야 하는지 확인합니다. -만, 어느효과적인페이지 오류는 페이지를 복사하고 권한을 업데이트해야 함을 나타낼 수 있습니다. 위키피디아 보기마이너 키와 메이저 키의 경우(예:페이징 요청) 잘못된 페이지 오류가 발생했습니다.
분할 오류는 잘못된 조건을 나타냅니다. 즉, 페이지가 메모리에 없을 뿐만 아니라 프로세스가 해당 페이지를 가상 주소 공간에 논리적으로 매핑하지 않기 때문에 커널이 수행할 교정 조치가 없습니다. 따라서 이는 거의 확실하게 프로그램이나 기본 라이브러리 중 하나의 버그를 나타냅니다. 예를 들어 프로세스에 유효하지 않은 메모리를 읽거나 쓰려고 시도하는 것입니다. 주소가 유효하면 스택이 손상되거나 다른 데이터가 뒤섞일 수 있지만 읽거나 쓸 수는 없습니다.연합 국가매핑된 페이지는 하드웨어에 의해 캡처됩니다.
더 큰 데이터 세트에서는 작동하지만 더 작은 데이터 세트에서는 작동하지 않는 이유는 전적으로 이 프로그램에만 해당됩니다. 어떤 이유로 더 작은 데이터 세트에서만 작동하는 프로그램 논리의 버그일 수 있습니다(예를 들어, 데이터 세트에 다음과 같은 필드가 있을 수 있습니다). 총 항목 수를 나타내며 업데이트되지 않으면 프로그램이 할당되지 않은 메모리를 맹목적으로 읽을 수 있습니다(다른 온전성 검사를 수행하지 않는 경우).
단순한 소프트웨어 버그보다 가능성이 훨씬 낮지만 분할 오류는 메모리 오류, CPU 오류 또는 정오표로 인한 하드웨어 트립과 같은 하드웨어 문제의 지표일 수도 있습니다(예:여기).
하드웨어 오류로 인한 Segfault로 인해 때때로 제대로 작동하지 않는 동작이 발생하는 경우가 많지만, 그 사이에 다른 작업을 실행하지 않으면 프로그램을 반복적으로 실행할 때 실제 RAM의 불량 비트가 동일한 방식으로 매핑될 수 있습니다. memtest86+를 시작하여 결함이 있는 RAM을 확인하고 Prime95와 같은 소프트웨어를 사용하여 CPU(FP Math FMA 실행 장치 포함)에 대한 스트레스 테스트를 시작하면 이러한 가능성을 배제할 수 있습니다.
gdb와 같은 디버거에서 프로그램을 실행하고 분할 오류가 발생할 때 추적을 얻을 수 있으며, 이는 범인을 가리킬 수 있습니다.
% gdb --args ./foo --bar --baz
(gdb) r # run the program
[...wait for segfault...]
(gdb) bt # get the backtrace for the current thread
답변2
접근이 허용되지 않은 메모리 위치에 접근하면 분할 오류가 발생합니다. 일반적으로 이는 널 포인터를 역참조하거나 할당된 메모리 범위 밖의 메모리에 액세스하기 때문에 발생합니다.
전체 데이터 세트는 유효하지만 하위 세트는 유효하지 않은 경우:
- 프로그램이 기능이 포함되지 않은 데이터 세트를 정상적으로 처리하는지 확인하십시오(아마도 데이터 세트에 있는 기능을 기반으로 배열을 할당한 다음 전체 데이터 세트의 알려진 기능 목록을 기반으로 길이를 가정하시겠습니까?)
- 비어 있어서 문제를 일으키는 그룹이 있습니까? 일반적으로 배열이 비어 있으면 일대일 오류가 발생합니까?
답변3
그 중 하나로 인해 발생할 수 있습니다. Chris가 설명했듯이 이는 대부분 소프트웨어 오류이지만 일부 하드웨어 문제(특히 메모리 오류 및 전원 오류)로 인해 세그폴트가 발생할 수도 있습니다. 메모리에서 잘못된 값을 읽으면 손상된 명령어 실행, 손상된 포인터 읽기, 손상된 페이지 테이블 사용 등이 발생할 수 있으며, 이 모든 것이 세그폴트를 유발할 수 있습니다.
그러나 차이점은 하드웨어 기반 세그폴트가 매우 심각하다는 것입니다.무작위의, 백만분의 1 비트 플립 이벤트로 인해 발생합니다(시스템이 이보다 더 불안정하면 부팅조차 되지 않습니다). 반면, 소프트웨어 버그로 인한 세그폴트는 완전히 반복될 수 있습니다.