2013-06-05 3 views
0

일부 C 코드와 인터페이스하는 일부 ada 코드가 있는데 C 코드에 의해 생성/생성 된 ada 코드에서 메모리 예외/SIGSEGV 신호를 잡는 데 문제가 있습니다. C 함수를 실행하는 ada 작업을 사용하고 있지만 C 코드에 문제가 있음을 알 수있는 유일한 방법은 더 많은 작업을 예약하려고 시도 할 때 ada 코드가 TASKING_ERROR을 발생시키는 것입니다. 문제가있는 유일한 징후는 내 ada 작업 스케줄러에서 TASKING_ERROR "모든 방법"으로되어 있기 때문에 문제가 어디에서 발생했는지 정확하게 파악하는 것은 불가능합니다. 작업 오류의 실제 원인을 정확하게 파악하기 위해 사용할 수있는 전략에 대한 아이디어가 있습니까?C 코드에서 메모리 예외 잡기

도움이나 아이디어를 많이 주시면 감사하겠습니다.

답변

3

-g 컴파일 및 -bargs -E과 결합하여 작업의 마지막 기회 예외 처리기를 사용해보십시오 (당신이 gnatmake을 사용하는 경우 즉, 그렇지 않으면, gnatbind -E).

void segv(void) { 
    char *zero = 0; 
    *zero = 0; 
} 

$ gnatmake call_segv.adb -g -bargs -E -largs segv.o -Wl,-no_pie 

건물

with Ada.Exceptions; 
with Ada.Text_IO; use Ada.Text_IO; 
procedure Call_Segv is 
    task T; 
    task body T is 
     procedure Segv; 
     pragma Import (C, Segv); 
    begin 
     Put_Line ("calling segv ..."); 
     Segv; 
     Put_Line ("... done."); 
    exception 
     when E : others => 
     Put_Line ("... exception: " 
        & Ada.Exceptions.Exception_Information (E)); 
    end T; 
begin 
    null; 
end Call_Segv; 

포함 segv.c

내가 얻을

$ call_segv 
calling segv ... 
... exception: Exception name: CONSTRAINT_ERROR 
Message: erroneous memory access 
Call stack traceback locations: 
0x10002cea5 0x7fff8ff8a948 0x100002077 0x100002304 0x10000ef16 0x7fff8ff9c7a0 

스택 추적 해석

$ atos -o call_segv 0x10002cea5 0x7fff8ff8a948 0x100002077 0x100002304 0x10000ef16 0x7fff8ff9c7a0 
__gnat_error_handler (in call_segv) + 53 
0x7fff8ff8a948 
segv (in call_segv) (segv.c:3) 
call_segv__tTKB.3158 (in call_segv) (call_segv.adb:10) 
system__tasking__stages__task_wrapper (in call_segv) + 406 
0x7fff8ff9c7a0 

(즉, 맥 OS X에서의

같은; 정상적으로 기기에서는 -Wl,-no_pie이 필요하지 않으며 atos 대신 addr2line을 사용합니다.

+0

위가 정확히 내가 원하는 것입니다. 나는 당신의 두 유닛을 가져 와서'gcc -g -c segv.c'를 사용하여 segv.c를 컴파일 한 다음'gnatmake call_segv.adb -g -bargs -E -largs segv.o'를 호출하고'segv ...를 호출했습니다. n 처리되지 않은 예외로 실행이 종료되었습니다. \ n 예외 이름 : STORAGE_ERROR \ n 메시지 : s-intman.adb : 124 명시 적 raise \ n 호출 스택 추적 위치 : 0xb7fc7cb9 '로 되돌아갑니다. 이것은 본질적으로 내가 더 큰 응용 프로그램을 가지고있는 것과 같은 문제입니다. 아마도 내 설정에서 뭔가 잘못 됐습니까? 나는이 시점에서 내가 해결책에 가깝다고 느낀다. 정말 고마워. – prelic

+0

어떤 OS/컴파일러를 사용하고 있습니까? 데비안 wheezy (GCC 4.6)에서는 맥과 매우 흡사하다. 즉, 태스크의 예외 핸들러에서 예외를 성공적으로 catch하고 '처리되지 않은 예외로 종료 됨'대신 유용한 추적을 얻습니다. Win XP와 GNAT GPL 2012를 사용하면'Execution terminated ... '을 얻을 수 있으며 추적 코드의 C 부분에 대한 유용한 해석이 없습니다. 인터넷 검색이 도움이되지 않습니다 (comp.lang.ada 스레드가 있었는데, 누군가 C와 같은 문제를보고했습니다). –

+0

와우 매우 흥미 롭습니다 ... 우리는 RHEL5.4를 사용하고 있으며,'gcc -x Ada --version'는 4.1.2를 반환합니다. 나중에 더 나은 결과를 얻으려면 나중에 버전에서 시도 할 것입니다. 다시 한번 감사드립니다. – prelic