2010-03-08 2 views
4

현재 알파 (Tru64)에서 i386 프로세서 (Linux)로 코드를 이식하고 있습니다. 예외 처리 루틴을 포팅 할 때까지 모든 것이 원활하게 처리되었습니다. 현재 우리는 부모 프로세스가 있습니다. 은 많은 하위 프로세스를 생성하며, 하위 프로세스 중 하나가 치명적인 경우 (필 수 없음) 프로세스를 잡는 루틴이 있습니다.i386에서 추적 구현

현재 오류 루틴에 함수 주소를 나열 할 수있는 추적 추적 루틴을 구현하는 가장 좋은 방법을 찾기 위해 고심하고 있습니다. 현재 루틴은 예외 및 예외 한정자 코드를 발생시킨 신호를 인쇄합니다.

어떤 도움을 받으실 지 모르겠지만이 단계에서 모든 프로세서에 대한 오류 처리를 작성하겠습니다. 그러나 i386 및 x86_64에 대해서만 정말로주의해야합니다.

감사

마크

답변

2

glibc 기능 backtrace()backtrace_symbols(), execinfo.h에서 유용 할 수 있습니다.

VALGRIND_PRINTF_BACKTRACE (형식, ...) :

0

는 불행히도, 스택의 레이아웃은 CPU, OS와 코드를 컴파일하는 데 사용되는 컴파일러에 따라 달라질 수 있기 때문에 "최고"방법이있다. 그러나 this article may help.

자식 프로세스; 부모 프로세스는 무언가 잘못되었다는 신호를받습니다. 당신은 자식 스택의 사본을 얻지 못한다.

+0

혼란을 가져 주셔서 죄송 합니다만 오류 처리가 잘못 이해되어 실제로 자식 프로세스에 걸렸습니다. 또한 GNU 컴파일러 (gcc)를 사용 중입니다. – user287108

+0

이 경우 기사는 모든 질문에 답변해야합니다. '-fno-omit-frame-pointer'로 컴파일해야합니다 (그렇지 않으면'% ESP'는 유효한 데이터를 포함하지 않습니다). –

1

backtrace()backtrace_symbols() - 두 번째는 함수 주소 배열을 반환하고 두 번째는 주소를 이름으로 확인합니다. 불행히도 정적 함수의 이름을 확인할 수 없습니다.

작동 시키려면 -rdynamic 플래그로 바이너리를 컴파일해야합니다.

0

당신이 Valgrind의를 통해 실행하는 경우에만 역 추적을 받고 괜찮 경우, 다음이 당신을위한 옵션이 될 수

그것은 당신에게 줄 것이다 정적 함수를 포함한 모든 함수에 대한 역 추적.