내가 매우 짧은 테스트 파일이 추적 :인쇄 스택은
let print_backtrace() = try raise Not_found with
Not_found -> Printexc.print_backtrace stdout;;
let f() = print_backtrace(); Printf.printf "this is to make f non-tail-recursive\n";;
f();
을 내가 컴파일하고 실행
% ocamlc -g test.ml
% OCAMLRUNPARAM=b ./a.out
Raised at file "test.ml", line 1, characters 35-44
this is to make f non-tail-recursive
이유는 스택 추적에 표시되지 f
입니까? 호출 된 위치의 스택 추적을 인쇄하는 함수를 작성하려면 어떻게해야합니까?
이 질문에 대한 답변은 절반입니다. 내가 원하는 것을 할 수 없다는 표시로서 나머지 절반에 침묵을 가져야 하는가? 즉, 전체 스택 추적을 인쇄하고 계속 진행할 것인가? –
OCaml 런타임에서 해킹하지 않고 할 수있는 좋은 방법은 없습니다. 어쩌면 ocamldebug 아래에서 실행할 수 있습니까? 또는 어떤 종류의 유닉스에서 실행되고있는 것처럼 보이기 때문에 빠른 문제 해결을위한 것이라면 프로세스를 fork()하고 하위 프로세스에서 캐치되지 않는 예외를 발생시켜 전체 스택 추적을 인쇄 한 다음 하위 프로세스를 종료하고 상위 프로세스에서 계속하십시오. 나는 C 년 전에 이런 일을했고 그것은 나를 위해 일했습니다. 그러나 그것은 추악하고 무언가를 엉망으로 만드는 경향이 있습니다. 이 방법을 시도하면 (아마도 나쁜 생각 일 것입니다.) 자식에서 _Exit()을 호출하여 버퍼를 비우지 않게하십시오. 감사합니다, –
네이티브 코드로 컴파일하면 스택을 인쇄하는 표준 함수를 사용할 수 있습니다. glibc의 libunwind 또는 backtrace. 결과가 매우 좋지는 않지만 대개 문제를 정확하게 지적 할 수 있습니다. – ygrek