2009-11-19 2 views
2

Google 제품을위한 크로스 플랫폼 스크립팅 언어를 구현 중입니다. 언어 VM에서 스택 오버플로 조건을 감지하고 적절히 처리해야한다는 요구 사항이 있습니다. 시작하기 전에 먼저 스택 오버 플로우가 없는지 확인하고, 첫 번째 문장을 다시 읽으십시오 - 이것은 스크립팅 언어이며 최종 사용자는이 언어로 잘못된 프로그램을 작성할 수 있습니다. 예를 들어 무한한 방법으로 스택을 오버플로 할 수 있습니다 재귀.Mac OS X에서 스택 오버플로 복구

이제 Windows에서 스택 오버플로를 감지하고 복구하는 방법을 알고 있습니다 (http://support.microsoft.com/kb/315937 참조). 그러나 나는 VM은 C++로 구현

맥 OS X 용 모든 솔루션 찾을 수 없습니다입니다 : MSVC++ 윈도우, GCC에

이상적 메커니즘이 UNIX 기능을 기반으로해야는 Mac OS X에이 또한 우리부터 Linux 로의 포팅을 계획하십시오.

감사합니다.

+6

"스택 오버플로에서 복구"는 나를 너무 많은 시간을 소비하여 일자리를 잃어 버렸다고 생각하게했습니다. ':) ' – sbi

+0

프로세스 스택을 VM 스택으로 사용하도록 제한 되었습니까, 아니면 VM이 자체 스택을 구현합니까? – Dipstick

+0

프로세스 스택을 사용합니다. –

답변

3

OCaml은 프로그래머가 스택 오버플로를 일으킬 수있는 "스크립팅"언어와 동일한 제약 조건을 가지고 있습니다. 네이티브 컴파일러는 함수 호출을 위해 시스템 스택을 사용합니다. 예외적으로 스택 오버플로를 처리합니다 (예외로 구체화).

좀 더 명확한 답변을받지 못하면 the OCaml sources에서 완료된 방법을 살펴 보시기 바랍니다.

~/ppc $ cat >> t.ml 

let rec f x = (f x) + (f x) ;; 

f 0 ;; 

~/ppc $ ocamlopt t.ml 
~/ppc $ ./a.out 
Fatal error: exception Stack_overflow 

위의 내용은 Mac OS X Leopard에 있습니다. 소스 파일에서 #ifdef HAS_STACK_OVERFLOW_DETECTION을 검색하십시오.

+0

감사합니다. OCaml을 살펴 보겠습니다. –

+0

OCaml 소스가 정말 유용했습니다. OCaml이 사용하는 SIGSEGV 신호 기술을 사용하여 스택 오버플로를 잡을 수있었습니다. 불행히도 OCaml은 C로 작성되었으며 C++ 예외 처리를 사용하지 않습니다. 내 VM은 C++로 작성되었으며 스택 오버플로가 발생하면 스택을 올바르게 푸는 데 C++ 예외가 발생합니다.스택 해체가 만기 될 때 SIGSEGV 시그널 핸들러로부터 C++ 예외를 던지려고하면 프로세스가 충돌합니다. 분명히 unwinding 프로세스는 시그널 핸들러 내에서 일어날 수 없다. 포인터를 보내 주셔서 감사합니다. 귀하의 답변에 투표했습니다. –

+1

@TN : 시그널 핸들러는 비동기 적으로 호출되며, 시그널 핸들러는 비동기 적으로 호출 될 수 있습니다. 주로 정기적으로 확인하는 플래그를 설정할 수 있습니다. – sbi

0

프로그램의 최대 스택 크기, 스택의 시작을 결정한 다음 스택 주소의 끝을 계산할 수 있습니까? VM에서 각 작업을 수행하기 전에 스택이 오버플로되는지 (최대 주소 이상으로 증가하는지) 확인한 다음 예외를 발생시킬 수 있습니다. 또 다른 방법은 스택 끝 (DEADBEEF 정도) 뒤에 식별자를 쓰고 각 스택 작업 후에 값을 확인하는 것입니다.


왜 수표를 추가 할 수 없는지 아직 알지 못합니다 (스택 조작이 정상적으로 감지되는 방식입니다). 그러나 스택 영역 끝에 하드웨어 중단 점을 추가 할 수 있습니다 (쓰기). 중단되면 스택 오버 플로우가 있음을 알 수 있습니다. 나는 당신의 디버깅 환경을 망칠 수 있기 때문에 조언을하지는 않을 것이다.

기본적으로 - VM이있는 경우 코드 (예 : 바이트 코드)를 읽고 컴파일/해석하는 장소도 있습니다. 그것이 마크를 확인할 수있는 곳입니다 (스택 버퍼 오버 플로우를 탐지하는 체크와 유사합니다).

+0

나는 이것이 가능하지 않을까 두렵다. "각 작업"전에 점검 할 중앙 위치가 없으며 모든 VM 작업 및 런타임 라이브러리 함수 구현에 검사를 추가하는 것이 실용적이지 않습니다. 프로세스 스택 오버플로를 감지하고이를 잡아서 스택을 풀어서 자체 런타임 오류 메시지를 출력 할 수 있어야합니다. –

+0

여전히 스택이없는 파이썬처럼 작동 할 수 있습니다. Stackless python은 스택을 가지고 있지만 힙 내에있는 VM 객체입니다. 구현 방식에 따라 메모리가 부족할 때만 스택이 부족합니다. –

0

libsigsegv을 살펴보십시오. 스택 오버 플로우 핸들러를 구현하는 데 도움이되는 루틴이있는 C 라이브러리입니다.