i386에서 추적을 구현합니다
-
18-09-2019 - |
문제
현재 코드를 알파 (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 (형식, ...) :
정적 기능을 포함한 모든 기능에 대한 역 추적을 제공합니다.