문제

현재 코드를 알파 (TRU64)에서 C의 i386 프로세서 (Linux)로 포팅하고 있습니다. 현재 우리는 많은 하위 프로세스를 스폰하는 상위 프로세스를 가지고 있으며,이 하위 프로세스 중 하나가 Fatal (Firneded)의 경우 프로세스를 포착하는 루틴이 있습니다.

현재 오류 로그에 함수 주소를 나열 할 수있는 트레이스 백 루틴을 구현하는 최상의 방법을 찾기 위해 고군분투하고 있습니다. 현재 내 루틴은 예외와 예외 예선 코드를 일으킨 신호를 인쇄합니다.

모든 도움이 크게 접수 될 것입니다. 이상적으로는 모든 프로세서에 대한 오류 처리를 작성하지만이 단계에서는 i386과 x86_64에 대해서만 관심이 있습니다.

감사

표시

도움이 되었습니까?

해결책

glibc 기능 backtrace() 그리고 backtrace_symbols(), 에서 execinfo.h, 사용 중일 수도 있습니다.

다른 팁

당신은 볼 수 있습니다 http://tlug.up.ac.za/wiki/index.php/obtaining_a_stack_trace_in_c_upon_sigsegv. 필요한 기능을 다룹니다. 그러나 libgdb 및 libdl에 연결하고 -rdynamic (실행 파일에 더 많은 기호 포함)으로 컴파일하고 일부 최적화 사용을 포기해야합니다.

당신을 도울 수있는 두 가지 GNU (비 포스) 기능이 있습니다. backtrace() 그리고 backtrace_symbols() - 먼저 함수 주소 배열을 반환하고 두 번째는 주소를 이름으로 반환합니다. 불행히도 정적 기능의 이름은 해결할 수 없습니다.

작동하도록하려면 이진을 컴파일해야합니다. -rdynamic 깃발.

불행히도, 스택 레이아웃은 CPU, OS 및 코드를 컴파일하는 데 사용되는 컴파일러에 따라 다를 수 있기 때문에 "최상의"방법이 없습니다. 하지만 이 기사가 도움이 될 수 있습니다.

이를 구현해야합니다 아동 프로세스; 부모 과정은 무언가 잘못되었다는 신호를 얻습니다. 당신은 아이 스택의 사본을 얻지 못합니다.

의견이 있으면 GCC를 사용하고 있다고 말합니다. 이것 http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/return-address.html#return-address 유용 할 수 있습니다.

Valgrind를 통과 할 때 적절한 뒷골목을 얻는 것이 좋으면 이것이 옵션 일 수 있습니다.

valgrind_printf_backtrace (형식, ...) :

정적 기능을 포함한 모든 기능에 대한 역 추적을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top